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

Artifact 79e303dc172579549f9921b4bfe94e0a8cb96722:


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 31 34 38 20 32 30 30 34 2f 30 32  ,v 1.148 2004/02
0280: 2f 31 32 20 31 35 3a 33 31 3a 32 31 20 64 72 68  /12 15:31:21 drh
0290: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
02a0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02b0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22  .#include "os.h"
02c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
02d0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69  .h>../*.** A poi
02e0: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72  nter to this str
02f0: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
0300: 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 69 6e  o communicate in
0310: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 72 6f  formation.** fro
0320: 6d 20 73 71 6c 69 74 65 49 6e 69 74 20 69 6e 74  m sqliteInit int
0330: 6f 20 74 68 65 20 73 71 6c 69 74 65 49 6e 69 74  o the sqliteInit
0340: 43 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 74 79 70  Callback..*/.typ
0350: 65 64 65 66 20 73 74 72 75 63 74 20 7b 0a 20 20  edef struct {.  
0360: 73 71 6c 69 74 65 20 2a 64 62 3b 20 20 20 20 20  sqlite *db;     
0370: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
0380: 61 73 65 20 62 65 69 6e 67 20 69 6e 69 74 69 61  ase being initia
0390: 6c 69 7a 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  lized */.  char 
03a0: 2a 2a 70 7a 45 72 72 4d 73 67 3b 20 20 20 20 2f  **pzErrMsg;    /
03b0: 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
03c0: 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 7d  stored here */.}
03d0: 20 49 6e 69 74 44 61 74 61 3b 0a 0a 2f 2a 0a 2a   InitData;../*.*
03e0: 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 69 74 44  * Fill the InitD
03f0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 77 69  ata structure wi
0400: 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
0410: 61 67 65 20 74 68 61 74 20 69 6e 64 69 63 61 74  age that indicat
0420: 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 64  es.** that the d
0430: 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
0440: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
0450: 69 64 20 63 6f 72 72 75 70 74 53 63 68 65 6d 61  id corruptSchema
0460: 28 49 6e 69 74 44 61 74 61 20 2a 70 44 61 74 61  (InitData *pData
0470: 29 7b 0a 20 20 73 71 6c 69 74 65 53 65 74 53 74  ){.  sqliteSetSt
0480: 72 69 6e 67 28 70 44 61 74 61 2d 3e 70 7a 45 72  ring(pData->pzEr
0490: 72 4d 73 67 2c 20 22 6d 61 6c 66 6f 72 6d 65 64  rMsg, "malformed
04a0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
04b0: 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 7d 0a  ", (char*)0);.}.
04c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
04d0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
04e0: 69 6e 65 20 66 6f 72 20 74 68 65 20 63 6f 64 65  ine for the code
04f0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
0500: 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  s the.** databas
0510: 65 2e 20 20 53 65 65 20 73 71 6c 69 74 65 49 6e  e.  See sqliteIn
0520: 69 74 28 29 20 62 65 6c 6f 77 20 66 6f 72 20 61  it() below for a
0530: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
0540: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ation..**.** Eac
0550: 68 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 61  h callback conta
0560: 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ins the followin
0570: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a  g information:.*
0580: 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d  *.**     argv[0]
0590: 20 3d 20 22 66 69 6c 65 2d 66 6f 72 6d 61 74 22   = "file-format"
05a0: 20 6f 72 20 22 73 63 68 65 6d 61 2d 63 6f 6f 6b   or "schema-cook
05b0: 69 65 22 20 6f 72 20 22 74 61 62 6c 65 22 20 6f  ie" or "table" o
05c0: 72 20 22 69 6e 64 65 78 22 0a 2a 2a 20 20 20 20  r "index".**    
05d0: 20 61 72 67 76 5b 31 5d 20 3d 20 74 61 62 6c 65   argv[1] = table
05e0: 20 6f 72 20 69 6e 64 65 78 20 6e 61 6d 65 20 6f   or index name o
05f0: 72 20 6d 65 74 61 20 73 74 61 74 65 6d 65 6e 74  r meta statement
0600: 20 74 79 70 65 2e 0a 2a 2a 20 20 20 20 20 61 72   type..**     ar
0610: 67 76 5b 32 5d 20 3d 20 72 6f 6f 74 20 70 61 67  gv[2] = root pag
0620: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  e number for tab
0630: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 4e 55  le or index.  NU
0640: 4c 4c 20 66 6f 72 20 6d 65 74 61 2e 0a 2a 2a 20  LL for meta..** 
0650: 20 20 20 20 61 72 67 76 5b 33 5d 20 3d 20 53 51      argv[3] = SQ
0660: 4c 20 74 65 78 74 20 66 6f 72 20 61 20 43 52 45  L text for a CRE
0670: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
0680: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
0690: 65 6e 74 2e 0a 2a 2a 20 20 20 20 20 61 72 67 76  ent..**     argv
06a0: 5b 34 5d 20 3d 20 22 31 22 20 66 6f 72 20 74 65  [4] = "1" for te
06b0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 22  mporary files, "
06c0: 30 22 20 66 6f 72 20 6d 61 69 6e 20 64 61 74 61  0" for main data
06d0: 62 61 73 65 2c 20 22 32 22 20 6f 72 20 6d 6f 72  base, "2" or mor
06e0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
06f0: 20 20 20 66 6f 72 20 61 75 78 69 6c 69 61 72 79     for auxiliary
0700: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
0710: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 0a 69 6e  .**.*/.static.in
0720: 74 20 73 71 6c 69 74 65 49 6e 69 74 43 61 6c 6c  t sqliteInitCall
0730: 62 61 63 6b 28 76 6f 69 64 20 2a 70 49 6e 69 74  back(void *pInit
0740: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
0750: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
0760: 61 7a 43 6f 6c 4e 61 6d 65 29 7b 0a 20 20 49 6e  azColName){.  In
0770: 69 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  itData *pData = 
0780: 28 49 6e 69 74 44 61 74 61 2a 29 70 49 6e 69 74  (InitData*)pInit
0790: 3b 0a 20 20 50 61 72 73 65 20 73 50 61 72 73 65  ;.  Parse sParse
07a0: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
07b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
07c0: 63 3d 3d 35 20 29 3b 0a 20 20 69 66 28 20 61 72  c==5 );.  if( ar
07d0: 67 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  gv==0 ) return 0
07e0: 3b 20 20 20 2f 2a 20 4d 69 67 68 74 20 68 61 70  ;   /* Might hap
07f0: 70 65 6e 20 69 66 20 45 4d 50 54 59 5f 52 45 53  pen if EMPTY_RES
0800: 55 4c 54 5f 43 41 4c 4c 42 41 43 4b 53 20 61 72  ULT_CALLBACKS ar
0810: 65 20 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 61 72  e on */.  if( ar
0820: 67 76 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  gv[0]==0 ){.    
0830: 63 6f 72 72 75 70 74 53 63 68 65 6d 61 28 70 44  corruptSchema(pD
0840: 61 74 61 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ata);.    return
0850: 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68   1;.  }.  switch
0860: 28 20 61 72 67 76 5b 30 5d 5b 30 5d 20 29 7b 0a  ( argv[0][0] ){.
0870: 20 20 20 20 63 61 73 65 20 27 76 27 3a 0a 20 20      case 'v':.  
0880: 20 20 63 61 73 65 20 27 69 27 3a 0a 20 20 20 20    case 'i':.    
0890: 63 61 73 65 20 27 74 27 3a 20 7b 20 20 2f 2a 20  case 't': {  /* 
08a0: 43 52 45 41 54 45 20 54 41 42 4c 45 2c 20 43 52  CREATE TABLE, CR
08b0: 45 41 54 45 20 49 4e 44 45 58 2c 20 6f 72 20 43  EATE INDEX, or C
08c0: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
08d0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
08e0: 66 28 20 61 72 67 76 5b 32 5d 3d 3d 30 20 7c 7c  f( argv[2]==0 ||
08f0: 20 61 72 67 76 5b 34 5d 3d 3d 30 20 29 7b 0a 20   argv[4]==0 ){. 
0900: 20 20 20 20 20 20 20 63 6f 72 72 75 70 74 53 63         corruptSc
0910: 68 65 6d 61 28 70 44 61 74 61 29 3b 0a 20 20 20  hema(pData);.   
0920: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
0930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
0940: 20 61 72 67 76 5b 33 5d 20 26 26 20 61 72 67 76   argv[3] && argv
0950: 5b 33 5d 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  [3][0] ){.      
0960: 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 70 61    /* Call the pa
0970: 72 73 65 72 20 74 6f 20 70 72 6f 63 65 73 73 20  rser to process 
0980: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 2c 20  a CREATE TABLE, 
0990: 49 4e 44 45 58 20 6f 72 20 56 49 45 57 2e 0a 20  INDEX or VIEW.. 
09a0: 20 20 20 20 20 20 20 2a 2a 20 42 75 74 20 62 65         ** But be
09b0: 63 61 75 73 65 20 73 50 61 72 73 65 2e 69 6e 69  cause sParse.ini
09c0: 74 46 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20  tFlag is set to 
09d0: 31 2c 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  1, no VDBE code 
09e0: 69 73 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20  is generated.   
09f0: 20 20 20 20 20 2a 2a 20 6f 72 20 65 78 65 63 75       ** or execu
0a00: 74 65 64 2e 20 20 41 6c 6c 20 74 68 65 20 70 61  ted.  All the pa
0a10: 72 73 65 72 20 64 6f 65 73 20 69 73 20 62 75 69  rser does is bui
0a20: 6c 64 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ld the internal 
0a30: 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  data.        ** 
0a40: 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
0a50: 64 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62  describe the tab
0a60: 6c 65 2c 20 69 6e 64 65 78 2c 20 6f 72 20 76 69  le, index, or vi
0a70: 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ew..        */. 
0a80: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
0a90: 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Parse, 0, sizeof
0aa0: 28 73 50 61 72 73 65 29 29 3b 0a 20 20 20 20 20  (sParse));.     
0ab0: 20 20 20 73 50 61 72 73 65 2e 64 62 20 3d 20 70     sParse.db = p
0ac0: 44 61 74 61 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Data->db;.      
0ad0: 20 20 73 50 61 72 73 65 2e 69 6e 69 74 46 6c 61    sParse.initFla
0ae0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  g = 1;.        s
0af0: 50 61 72 73 65 2e 69 44 62 20 3d 20 61 74 6f 69  Parse.iDb = atoi
0b00: 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20 20 20  (argv[4]);.     
0b10: 20 20 20 73 50 61 72 73 65 2e 6e 65 77 54 6e 75     sParse.newTnu
0b20: 6d 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 32 5d  m = atoi(argv[2]
0b30: 29 3b 0a 20 20 20 20 20 20 20 20 73 50 61 72 73  );.        sPars
0b40: 65 2e 75 73 65 43 61 6c 6c 62 61 63 6b 20 3d 20  e.useCallback = 
0b50: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
0b60: 65 52 75 6e 50 61 72 73 65 72 28 26 73 50 61 72  eRunParser(&sPar
0b70: 73 65 2c 20 61 72 67 76 5b 33 5d 2c 20 70 44 61  se, argv[3], pDa
0b80: 74 61 2d 3e 70 7a 45 72 72 4d 73 67 29 3b 0a 20  ta->pzErrMsg);. 
0b90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ba0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51      /* If the SQ
0bb0: 4c 20 63 6f 6c 75 6d 6e 20 69 73 20 62 6c 61 6e  L column is blan
0bc0: 6b 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  k it means this 
0bd0: 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  is an index that
0be0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 61 73 20  .        ** was 
0bf0: 63 72 65 61 74 65 64 20 74 6f 20 62 65 20 74 68  created to be th
0c00: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  e PRIMARY KEY or
0c10: 20 74 6f 20 66 75 6c 66 69 6c 6c 20 61 20 55 4e   to fulfill a UN
0c20: 49 51 55 45 0a 20 20 20 20 20 20 20 20 2a 2a 20  IQUE.        ** 
0c30: 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 61  constraint for a
0c40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 2e 20 20   CREATE TABLE.  
0c50: 54 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  The index should
0c60: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
0c70: 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 63 72        ** been cr
0c80: 65 61 74 65 64 20 77 68 65 6e 20 77 65 20 70 72  eated when we pr
0c90: 6f 63 65 73 73 65 64 20 74 68 65 20 43 52 45 41  ocessed the CREA
0ca0: 54 45 20 54 41 42 4c 45 2e 20 20 41 6c 6c 20 77  TE TABLE.  All w
0cb0: 65 20 68 61 76 65 0a 20 20 20 20 20 20 20 20 2a  e have.        *
0cc0: 2a 20 74 6f 20 64 6f 20 68 65 72 65 20 69 73 20  * to do here is 
0cd0: 72 65 63 6f 72 64 20 74 68 65 20 72 6f 6f 74 20  record the root 
0ce0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
0cf0: 74 68 61 74 20 69 6e 64 65 78 2e 0a 20 20 20 20  that index..    
0d00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
0d10: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
0d20: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 0a  Index *pIndex;..
0d30: 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 61 74          iDb = at
0d40: 6f 69 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 20  oi(argv[4]);.   
0d50: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
0d60: 3e 3d 30 20 26 26 20 69 44 62 3c 70 44 61 74 61  >=0 && iDb<pData
0d70: 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  ->db->nDb );.   
0d80: 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 73 71       pIndex = sq
0d90: 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28 70 44  liteFindIndex(pD
0da0: 61 74 61 2d 3e 64 62 2c 20 61 72 67 76 5b 31 5d  ata->db, argv[1]
0db0: 2c 20 70 44 61 74 61 2d 3e 64 62 2d 3e 61 44 62  , pData->db->aDb
0dc0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  [iDb].zName);.  
0dd0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
0de0: 3d 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 74  ==0 || pIndex->t
0df0: 6e 75 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  num!=0 ){.      
0e00: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6e 20      /* This can 
0e10: 6f 63 63 75 72 20 69 66 20 74 68 65 72 65 20 65  occur if there e
0e20: 78 69 73 74 73 20 61 6e 20 69 6e 64 65 78 20 6f  xists an index o
0e30: 6e 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 77  n a TEMP table w
0e40: 68 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a  hich.          *
0e50: 2a 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  * has the same n
0e60: 61 6d 65 20 61 73 20 61 6e 6f 74 68 65 72 20 69  ame as another i
0e70: 6e 64 65 78 20 6f 6e 20 61 20 70 65 72 6d 61 6e  ndex on a perman
0e80: 65 6e 74 20 69 6e 64 65 78 2e 20 20 53 69 6e 63  ent index.  Sinc
0e90: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
0ea0: 68 65 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62  he permanent tab
0eb0: 6c 65 20 69 73 20 68 69 64 64 65 6e 20 62 79 20  le is hidden by 
0ec0: 74 68 65 20 54 45 4d 50 20 74 61 62 6c 65 2c 20  the TEMP table, 
0ed0: 77 65 20 63 61 6e 20 61 6c 73 6f 0a 20 20 20 20  we can also.    
0ee0: 20 20 20 20 20 20 2a 2a 20 73 61 66 65 6c 79 20        ** safely 
0ef0: 69 67 6e 6f 72 65 20 74 68 65 20 69 6e 64 65 78  ignore the index
0f00: 20 6f 6e 20 74 68 65 20 70 65 72 6d 61 6e 65 6e   on the permanen
0f10: 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  t table..       
0f20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
0f30: 2f 2a 20 44 6f 20 4e 6f 74 68 69 6e 67 20 2a 2f  /* Do Nothing */
0f40: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
0f50: 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65  .          pInde
0f60: 78 2d 3e 74 6e 75 6d 20 3d 20 61 74 6f 69 28 61  x->tnum = atoi(a
0f70: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[2]);.       
0f80: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
0f90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0fa0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
0fb0: 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6e 20 6e     /* This can n
0fc0: 6f 74 20 68 61 70 70 65 6e 21 20 2a 2f 0a 20 20  ot happen! */.  
0fd0: 20 20 20 20 6e 45 72 72 20 3d 20 31 3b 0a 20 20      nErr = 1;.  
0fe0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 72 72      assert( nErr
0ff0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ==0 );.    }.  }
1000: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a  .  return nErr;.
1010: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
1020: 20 61 20 63 61 6c 6c 62 61 63 6b 20 70 72 6f 63   a callback proc
1030: 65 64 75 72 65 20 75 73 65 64 20 74 6f 20 72 65  edure used to re
1040: 63 6f 6e 73 74 72 75 63 74 20 61 20 74 61 62 6c  construct a tabl
1050: 65 2e 20 20 54 68 65 0a 2a 2a 20 6e 61 6d 65 20  e.  The.** name 
1060: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
1070: 62 65 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  be reconstructed
1080: 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 61 73   is passed in as
1090: 20 61 72 67 76 5b 30 5d 2e 0a 2a 2a 0a 2a 2a 20   argv[0]..**.** 
10a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10b0: 75 73 65 64 20 74 6f 20 61 75 74 6f 6d 61 74 69  used to automati
10c0: 63 61 6c 6c 79 20 75 70 67 72 61 64 65 20 61 20  cally upgrade a 
10d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a 2a 2a  database from.**
10e0: 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e 20   format version 
10f0: 31 20 6f 72 20 32 20 74 6f 20 76 65 72 73 69 6f  1 or 2 to versio
1100: 6e 20 33 2e 20 20 54 68 65 20 63 6f 72 72 65 63  n 3.  The correc
1110: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 0a 2a  t operation of.*
1120: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
1130: 65 6c 79 73 20 6f 6e 20 74 68 65 20 66 61 63 74  elys on the fact
1140: 20 74 68 61 74 20 6e 6f 20 69 6e 64 69 63 65 73   that no indices
1150: 20 61 72 65 20 75 73 65 64 20 77 68 65 6e 0a 2a   are used when.*
1160: 2a 20 63 6f 70 79 69 6e 67 20 61 20 74 61 62 6c  * copying a tabl
1170: 65 20 6f 75 74 20 74 6f 20 61 20 74 65 6d 70 6f  e out to a tempo
1180: 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
1190: 20 54 68 65 20 63 68 61 6e 67 65 20 66 72 6f 6d   The change from
11a0: 20 76 65 72 73 69 6f 6e 20 32 20 74 6f 20 76 65   version 2 to ve
11b0: 72 73 69 6f 6e 20 33 20 6f 63 63 75 72 72 65 64  rsion 3 occurred
11c0: 20 62 65 74 77 65 65 6e 20 53 51 4c 69 74 65 0a   between SQLite.
11d0: 2a 2a 20 76 65 72 73 69 6f 6e 20 32 2e 35 2e 36  ** version 2.5.6
11e0: 20 61 6e 64 20 32 2e 36 2e 30 20 6f 6e 20 32 30   and 2.6.0 on 20
11f0: 30 32 2d 4a 75 6c 79 2d 31 38 2e 20 20 0a 2a 2f  02-July-18.  .*/
1200: 0a 73 74 61 74 69 63 0a 69 6e 74 20 75 70 67 72  .static.int upgr
1210: 61 64 65 5f 33 5f 63 61 6c 6c 62 61 63 6b 28 76  ade_3_callback(v
1220: 6f 69 64 20 2a 70 49 6e 69 74 2c 20 69 6e 74 20  oid *pInit, int 
1230: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
1240: 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65  v, char **NotUse
1250: 64 29 7b 0a 20 20 49 6e 69 74 44 61 74 61 20 2a  d){.  InitData *
1260: 70 44 61 74 61 20 3d 20 28 49 6e 69 74 44 61 74  pData = (InitDat
1270: 61 2a 29 70 49 6e 69 74 3b 0a 20 20 69 6e 74 20  a*)pInit;.  int 
1280: 72 63 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  rc;.  Table *pTa
1290: 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  b;.  Trigger *pT
12a0: 72 69 67 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  rig;.  char *zEr
12b0: 72 20 3d 20 30 3b 0a 0a 20 20 70 54 61 62 20 3d  r = 0;..  pTab =
12c0: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
12d0: 28 70 44 61 74 61 2d 3e 64 62 2c 20 61 72 67 76  (pData->db, argv
12e0: 5b 30 5d 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  [0], 0);.  asser
12f0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
1300: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 53 74  assert( sqliteSt
1310: 72 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  rICmp(pTab->zNam
1320: 65 2c 20 61 72 67 76 5b 30 5d 29 3d 3d 30 20 29  e, argv[0])==0 )
1330: 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  ;.  if( pTab ){.
1340: 20 20 20 20 70 54 72 69 67 20 3d 20 70 54 61 62      pTrig = pTab
1350: 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20  ->pTrigger;.    
1360: 70 54 61 62 2d 3e 70 54 72 69 67 67 65 72 20 3d  pTab->pTrigger =
1370: 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20   0;  /* Disable 
1380: 61 6c 6c 20 74 72 69 67 67 65 72 73 20 62 65 66  all triggers bef
1390: 6f 72 65 20 72 65 62 75 69 6c 64 69 6e 67 20 74  ore rebuilding t
13a0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 7d 0a  he table */.  }.
13b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 65 78    rc = sqlite_ex
13c0: 65 63 5f 70 72 69 6e 74 66 28 70 44 61 74 61 2d  ec_printf(pData-
13d0: 3e 64 62 2c 0a 20 20 20 20 22 43 52 45 41 54 45  >db,.    "CREATE
13e0: 20 54 45 4d 50 20 54 41 42 4c 45 20 73 71 6c 69   TEMP TABLE sqli
13f0: 74 65 5f 78 20 41 53 20 53 45 4c 45 43 54 20 2a  te_x AS SELECT *
1400: 20 46 52 4f 4d 20 27 25 71 27 3b 20 22 0a 20 20   FROM '%q'; ".  
1410: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
1420: 25 71 27 3b 20 22 0a 20 20 20 20 22 49 4e 53 45  %q'; ".    "INSE
1430: 52 54 20 49 4e 54 4f 20 27 25 71 27 20 53 45 4c  RT INTO '%q' SEL
1440: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
1450: 65 5f 78 3b 20 22 0a 20 20 20 20 22 44 52 4f 50  e_x; ".    "DROP
1460: 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 78 3b   TABLE sqlite_x;
1470: 22 2c 0a 20 20 20 20 30 2c 20 30 2c 20 26 7a 45  ",.    0, 0, &zE
1480: 72 72 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72 67  rr, argv[0], arg
1490: 76 5b 30 5d 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  v[0], argv[0]);.
14a0: 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
14b0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
14c0: 67 28 70 44 61 74 61 2d 3e 70 7a 45 72 72 4d 73  g(pData->pzErrMs
14d0: 67 2c 20 7a 45 72 72 2c 20 28 63 68 61 72 2a 29  g, zErr, (char*)
14e0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 66  0);.    sqlite_f
14f0: 72 65 65 6d 65 6d 28 7a 45 72 72 29 3b 0a 20 20  reemem(zErr);.  
1500: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
1510: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20  ror occurred in 
1520: 74 68 65 20 53 51 4c 20 61 62 6f 76 65 2c 20 74  the SQL above, t
1530: 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1540: 69 6f 6e 20 77 69 6c 6c 0a 20 20 2a 2a 20 72 6f  ion will.  ** ro
1550: 6c 6c 62 61 63 6b 20 77 68 69 63 68 20 77 69 6c  llback which wil
1560: 6c 20 64 65 6c 65 74 65 20 74 68 65 20 69 6e 74  l delete the int
1570: 65 72 6e 61 6c 20 73 79 6d 62 6f 6c 20 74 61 62  ernal symbol tab
1580: 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  les.  This will.
1590: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 73    ** cause the s
15a0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70 54  tructure that pT
15b0: 61 62 20 70 6f 69 6e 74 73 20 74 6f 20 62 65 20  ab points to be 
15c0: 64 65 6c 65 74 65 64 2e 20 20 49 6e 20 63 61 73  deleted.  In cas
15d0: 65 20 74 68 61 74 0a 20 20 2a 2a 20 68 61 70 70  e that.  ** happ
15e0: 65 6e 65 64 2c 20 77 65 20 6e 65 65 64 20 74 6f  ened, we need to
15f0: 20 72 65 66 65 74 63 68 20 70 54 61 62 2e 0a 20   refetch pTab.. 
1600: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   */.  pTab = sql
1610: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 44 61  iteFindTable(pDa
1620: 74 61 2d 3e 64 62 2c 20 61 72 67 76 5b 30 5d 2c  ta->db, argv[0],
1630: 20 30 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20   0);.  if( pTab 
1640: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
1650: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 54 61  qliteStrICmp(pTa
1660: 62 2d 3e 7a 4e 61 6d 65 2c 20 61 72 67 76 5b 30  b->zName, argv[0
1670: 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  ])==0 );.    pTa
1680: 62 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54  b->pTrigger = pT
1690: 72 69 67 3b 20 20 2f 2a 20 52 65 2d 65 6e 61 62  rig;  /* Re-enab
16a0: 6c 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  le triggers */. 
16b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d   }.  return rc!=
16c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
16d0: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
16e0: 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
16f0: 73 65 20 73 63 68 65 6d 61 20 61 6e 64 20 69 6e  se schema and in
1700: 69 74 69 61 6c 69 7a 65 20 69 6e 74 65 72 6e 61  itialize interna
1710: 6c 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  l.** data struct
1720: 75 72 65 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ures for a singl
1730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1740: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
1750: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
1760: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 20  ile is given by 
1770: 69 44 62 2e 20 20 69 44 62 3d 3d 30 20 69 73 20  iDb.  iDb==0 is 
1780: 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69  used for the mai
1790: 6e 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20  n.** database.  
17a0: 69 44 62 3d 3d 31 20 73 68 6f 75 6c 64 20 6e 65  iDb==1 should ne
17b0: 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 69 44  ver be used.  iD
17c0: 62 3e 3d 32 20 69 73 20 75 73 65 64 20 66 6f 72  b>=2 is used for
17d0: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
17e0: 74 61 62 61 73 65 73 2e 20 20 52 65 74 75 72 6e  tabases.  Return
17f0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49   one of the SQLI
1800: 54 45 5f 20 65 72 72 6f 72 20 63 6f 64 65 73 20  TE_ error codes 
1810: 74 6f 0a 2a 2a 20 69 6e 64 69 63 61 74 65 20 73  to.** indicate s
1820: 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72  uccess or failur
1830: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1840: 20 73 71 6c 69 74 65 49 6e 69 74 4f 6e 65 28 73   sqliteInitOne(s
1850: 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69  qlite *db, int i
1860: 44 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  Db, char **pzErr
1870: 4d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Msg){.  int rc;.
1880: 20 20 42 74 43 75 72 73 6f 72 20 2a 63 75 72 4d    BtCursor *curM
1890: 61 69 6e 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  ain;.  int size;
18a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
18b0: 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 36 5d    char *azArg[6]
18c0: 3b 0a 20 20 63 68 61 72 20 7a 44 62 4e 75 6d 5b  ;.  char zDbNum[
18d0: 33 30 5d 3b 0a 20 20 69 6e 74 20 6d 65 74 61 5b  30];.  int meta[
18e0: 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d  SQLITE_N_BTREE_M
18f0: 45 54 41 5d 3b 0a 20 20 50 61 72 73 65 20 73 50  ETA];.  Parse sP
1900: 61 72 73 65 3b 0a 20 20 49 6e 69 74 44 61 74 61  arse;.  InitData
1910: 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a   initData;..  /*
1920: 0a 20 20 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  .  ** The master
1930: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
1940: 68 61 73 20 61 20 73 74 72 75 63 74 75 72 65 20  has a structure 
1950: 6c 69 6b 65 20 74 68 69 73 0a 20 20 2a 2f 0a 20  like this.  */. 
1960: 20 73 74 61 74 69 63 20 63 68 61 72 20 6d 61 73   static char mas
1970: 74 65 72 5f 73 63 68 65 6d 61 5b 5d 20 3d 20 0a  ter_schema[] = .
1980: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
1990: 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  LE sqlite_master
19a0: 28 5c 6e 22 0a 20 20 20 20 20 22 20 20 74 79 70  (\n".     "  typ
19b0: 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
19c0: 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  "  name text,\n"
19d0: 0a 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d  .     "  tbl_nam
19e0: 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
19f0: 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65  "  rootpage inte
1a00: 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ger,\n".     "  
1a10: 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
1a20: 20 22 29 22 0a 20 20 3b 0a 20 20 73 74 61 74 69   ")".  ;.  stati
1a30: 63 20 63 68 61 72 20 74 65 6d 70 5f 6d 61 73 74  c char temp_mast
1a40: 65 72 5f 73 63 68 65 6d 61 5b 5d 20 3d 20 0a 20  er_schema[] = . 
1a50: 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50      "CREATE TEMP
1a60: 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 74 65   TABLE sqlite_te
1a70: 6d 70 5f 6d 61 73 74 65 72 28 5c 6e 22 0a 20 20  mp_master(\n".  
1a80: 20 20 20 22 20 20 74 79 70 65 20 74 65 78 74 2c     "  type text,
1a90: 5c 6e 22 0a 20 20 20 20 20 22 20 20 6e 61 6d 65  \n".     "  name
1aa0: 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 22   text,\n".     "
1ab0: 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c    tbl_name text,
1ac0: 5c 6e 22 0a 20 20 20 20 20 22 20 20 72 6f 6f 74  \n".     "  root
1ad0: 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22  page integer,\n"
1ae0: 0a 20 20 20 20 20 22 20 20 73 71 6c 20 74 65 78  .     "  sql tex
1af0: 74 5c 6e 22 0a 20 20 20 20 20 22 29 22 0a 20 20  t\n".     ")".  
1b00: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1b10: 6f 77 69 6e 67 20 53 51 4c 20 77 69 6c 6c 20 72  owing SQL will r
1b20: 65 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 66  ead the schema f
1b30: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
1b40: 61 62 6c 65 73 2e 0a 20 20 2a 2a 20 54 68 65 20  ables..  ** The 
1b50: 66 69 72 73 74 20 76 65 72 73 69 6f 6e 20 77 6f  first version wo
1b60: 72 6b 73 20 77 69 74 68 20 53 51 4c 69 74 65 20  rks with SQLite 
1b70: 66 69 6c 65 20 66 6f 72 6d 61 74 73 20 32 20 6f  file formats 2 o
1b80: 72 20 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20  r greater..  ** 
1b90: 54 68 65 20 73 65 63 6f 6e 64 20 76 65 72 73 69  The second versi
1ba0: 6f 6e 20 69 73 20 66 6f 72 20 66 6f 72 6d 61 74  on is for format
1bb0: 20 31 20 66 69 6c 65 73 2e 0a 20 20 2a 2a 0a 20   1 files..  **. 
1bc0: 20 2a 2a 20 42 65 67 69 6e 6e 69 6e 67 20 77 69   ** Beginning wi
1bd0: 74 68 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 32  th file format 2
1be0: 2c 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  , the rowid for 
1bf0: 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 69 65  new table entrie
1c00: 73 0a 20 20 2a 2a 20 28 69 6e 63 6c 75 64 69 6e  s.  ** (includin
1c10: 67 20 65 6e 74 72 69 65 73 20 69 6e 20 73 71 6c  g entries in sql
1c20: 69 74 65 5f 6d 61 73 74 65 72 29 20 69 73 20 61  ite_master) is a
1c30: 6e 20 69 6e 63 72 65 61 73 69 6e 67 20 69 6e 74  n increasing int
1c40: 65 67 65 72 2e 0a 20 20 2a 2a 20 53 6f 20 66 6f  eger..  ** So fo
1c50: 72 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 32 20  r file format 2 
1c60: 61 6e 64 20 6c 61 74 65 72 2c 20 77 65 20 63 61  and later, we ca
1c70: 6e 20 70 6c 61 79 20 62 61 63 6b 20 73 71 6c 69  n play back sqli
1c80: 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 61  te_master.  ** a
1c90: 6e 64 20 61 6c 6c 20 74 68 65 20 43 52 45 41 54  nd all the CREAT
1ca0: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c  E statements wil
1cb0: 6c 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  l appear in the 
1cc0: 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 20 20 2a  right order..  *
1cd0: 2a 20 42 75 74 20 77 69 74 68 20 66 69 6c 65 20  * But with file 
1ce0: 66 6f 72 6d 61 74 20 31 2c 20 74 61 62 6c 65 20  format 1, table 
1cf0: 65 6e 74 72 69 65 73 20 77 65 72 65 20 72 61 6e  entries were ran
1d00: 64 6f 6d 20 61 6e 64 20 73 6f 20 77 65 0a 20 20  dom and so we.  
1d10: 2a 2a 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  ** have to make 
1d20: 73 75 72 65 20 74 68 65 20 43 52 45 41 54 45 20  sure the CREATE 
1d30: 54 41 42 4c 45 73 20 6f 63 63 75 72 20 62 65 66  TABLEs occur bef
1d40: 6f 72 65 20 74 68 65 69 72 20 63 6f 72 72 65 73  ore their corres
1d50: 70 6f 6e 64 69 6e 67 0a 20 20 2a 2a 20 43 52 45  ponding.  ** CRE
1d60: 41 54 45 20 49 4e 44 45 58 73 2e 20 20 28 57 65  ATE INDEXs.  (We
1d70: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 64   don't have to d
1d80: 65 61 6c 20 77 69 74 68 20 43 52 45 41 54 45 20  eal with CREATE 
1d90: 56 49 45 57 20 6f 72 0a 20 20 2a 2a 20 43 52 45  VIEW or.  ** CRE
1da0: 41 54 45 20 54 52 49 47 47 45 52 20 69 6e 20 66  ATE TRIGGER in f
1db0: 69 6c 65 20 66 6f 72 6d 61 74 20 31 20 62 65 63  ile format 1 bec
1dc0: 61 75 73 65 20 74 68 6f 73 65 20 63 6f 6e 73 74  ause those const
1dd0: 72 75 63 74 73 20 64 69 64 0a 20 20 2a 2a 20 6e  ructs did.  ** n
1de0: 6f 74 20 65 78 69 73 74 20 74 68 65 6e 2e 29 20  ot exist then.) 
1df0: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  .  */.  static c
1e00: 68 61 72 20 69 6e 69 74 5f 73 63 72 69 70 74 5b  har init_script[
1e10: 5d 20 3d 20 0a 20 20 20 20 20 22 53 45 4c 45 43  ] = .     "SELEC
1e20: 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 72 6f  T type, name, ro
1e30: 6f 74 70 61 67 65 2c 20 73 71 6c 2c 20 31 20 46  otpage, sql, 1 F
1e40: 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ROM sqlite_temp_
1e50: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 22 55  master ".     "U
1e60: 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
1e70: 22 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61  "SELECT type, na
1e80: 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71  me, rootpage, sq
1e90: 6c 2c 20 30 20 46 52 4f 4d 20 73 71 6c 69 74 65  l, 0 FROM sqlite
1ea0: 5f 6d 61 73 74 65 72 22 3b 0a 20 20 73 74 61 74  _master";.  stat
1eb0: 69 63 20 63 68 61 72 20 6f 6c 64 65 72 5f 69 6e  ic char older_in
1ec0: 69 74 5f 73 63 72 69 70 74 5b 5d 20 3d 20 0a 20  it_script[] = . 
1ed0: 20 20 20 20 22 53 45 4c 45 43 54 20 74 79 70 65      "SELECT type
1ee0: 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  , name, rootpage
1ef0: 2c 20 73 71 6c 2c 20 31 20 46 52 4f 4d 20 73 71  , sql, 1 FROM sq
1f00: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
1f10: 20 22 0a 20 20 20 20 20 22 55 4e 49 4f 4e 20 41   ".     "UNION A
1f20: 4c 4c 20 22 0a 20 20 20 20 20 22 53 45 4c 45 43  LL ".     "SELEC
1f30: 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 72 6f  T type, name, ro
1f40: 6f 74 70 61 67 65 2c 20 73 71 6c 2c 20 30 20 46  otpage, sql, 0 F
1f50: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1f60: 72 20 22 0a 20 20 20 20 20 22 57 48 45 52 45 20  r ".     "WHERE 
1f70: 74 79 70 65 3d 27 74 61 62 6c 65 27 20 22 0a 20  type='table' ". 
1f80: 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22      "UNION ALL "
1f90: 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 79  .     "SELECT ty
1fa0: 70 65 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61  pe, name, rootpa
1fb0: 67 65 2c 20 73 71 6c 2c 20 30 20 46 52 4f 4d 20  ge, sql, 0 FROM 
1fc0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
1fd0: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
1fe0: 3d 27 69 6e 64 65 78 27 22 3b 0a 0a 0a 20 20 61  ='index'";...  a
1ff0: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
2000: 20 69 44 62 21 3d 31 20 26 26 20 69 44 62 3c 64   iDb!=1 && iDb<d
2010: 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
2020: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 73 63  Construct the sc
2030: 68 65 6d 61 20 74 61 62 6c 65 73 3a 20 73 71 6c  hema tables: sql
2040: 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 20 73  ite_master and s
2050: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
2060: 72 0a 20 20 2a 2f 0a 20 20 61 7a 41 72 67 5b 30  r.  */.  azArg[0
2070: 5d 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 61  ] = "table";.  a
2080: 7a 41 72 67 5b 31 5d 20 3d 20 4d 41 53 54 45 52  zArg[1] = MASTER
2090: 5f 4e 41 4d 45 3b 0a 20 20 61 7a 41 72 67 5b 32  _NAME;.  azArg[2
20a0: 5d 20 3d 20 22 32 22 3b 0a 20 20 61 7a 41 72 67  ] = "2";.  azArg
20b0: 5b 33 5d 20 3d 20 6d 61 73 74 65 72 5f 73 63 68  [3] = master_sch
20c0: 65 6d 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ema;.  sprintf(z
20d0: 44 62 4e 75 6d 2c 20 22 25 64 22 2c 20 69 44 62  DbNum, "%d", iDb
20e0: 29 3b 0a 20 20 61 7a 41 72 67 5b 34 5d 20 3d 20  );.  azArg[4] = 
20f0: 7a 44 62 4e 75 6d 3b 0a 20 20 61 7a 41 72 67 5b  zDbNum;.  azArg[
2100: 35 5d 20 3d 20 30 3b 0a 20 20 69 6e 69 74 44 61  5] = 0;.  initDa
2110: 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 69 6e  ta.db = db;.  in
2120: 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20  itData.pzErrMsg 
2130: 3d 20 70 7a 45 72 72 4d 73 67 3b 0a 20 20 73 71  = pzErrMsg;.  sq
2140: 6c 69 74 65 49 6e 69 74 43 61 6c 6c 62 61 63 6b  liteInitCallback
2150: 28 26 69 6e 69 74 44 61 74 61 2c 20 35 2c 20 61  (&initData, 5, a
2160: 7a 41 72 67 2c 20 30 29 3b 0a 20 20 70 54 61 62  zArg, 0);.  pTab
2170: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
2180: 6c 65 28 64 62 2c 20 4d 41 53 54 45 52 5f 4e 41  le(db, MASTER_NA
2190: 4d 45 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 69  ME, "main");.  i
21a0: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 70  f( pTab ){.    p
21b0: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  Tab->readOnly = 
21c0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  1;.  }.  if( iDb
21d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 7a 41 72 67  ==0 ){.    azArg
21e0: 5b 31 5d 20 3d 20 54 45 4d 50 5f 4d 41 53 54 45  [1] = TEMP_MASTE
21f0: 52 5f 4e 41 4d 45 3b 0a 20 20 20 20 61 7a 41 72  R_NAME;.    azAr
2200: 67 5b 33 5d 20 3d 20 74 65 6d 70 5f 6d 61 73 74  g[3] = temp_mast
2210: 65 72 5f 73 63 68 65 6d 61 3b 0a 20 20 20 20 61  er_schema;.    a
2220: 7a 41 72 67 5b 34 5d 20 3d 20 22 31 22 3b 0a 20  zArg[4] = "1";. 
2230: 20 20 20 73 71 6c 69 74 65 49 6e 69 74 43 61 6c     sqliteInitCal
2240: 6c 62 61 63 6b 28 26 69 6e 69 74 44 61 74 61 2c  lback(&initData,
2250: 20 35 2c 20 61 7a 41 72 67 2c 20 30 29 3b 0a 20   5, azArg, 0);. 
2260: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
2270: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 54 45  FindTable(db, TE
2280: 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  MP_MASTER_NAME, 
2290: 22 74 65 6d 70 22 29 3b 0a 20 20 20 20 69 66 28  "temp");.    if(
22a0: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
22b0: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  Tab->readOnly = 
22c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
22d0: 2f 2a 20 43 72 65 61 74 65 20 61 20 63 75 72 73  /* Create a curs
22e0: 6f 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64  or to hold the d
22f0: 61 74 61 62 61 73 65 20 6f 70 65 6e 0a 20 20 2a  atabase open.  *
2300: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /.  if( db->aDb[
2310: 69 44 62 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  iDb].pBt==0 ) re
2320: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72    rc = sqliteBtr
2340: 65 65 43 75 72 73 6f 72 28 64 62 2d 3e 61 44 62  eeCursor(db->aDb
2350: 5b 69 44 62 5d 2e 70 42 74 2c 20 32 2c 20 30 2c  [iDb].pBt, 2, 0,
2360: 20 26 63 75 72 4d 61 69 6e 29 3b 0a 20 20 69 66   &curMain);.  if
2370: 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
2380: 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  teSetString(pzEr
2390: 72 4d 73 67 2c 20 73 71 6c 69 74 65 5f 65 72 72  rMsg, sqlite_err
23a0: 6f 72 5f 73 74 72 69 6e 67 28 72 63 29 2c 20 28  or_string(rc), (
23b0: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
23c0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
23d0: 2f 2a 20 47 65 74 20 74 68 65 20 64 61 74 61 62  /* Get the datab
23e0: 61 73 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  ase meta informa
23f0: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  tion.  */.  rc =
2400: 20 73 71 6c 69 74 65 42 74 72 65 65 47 65 74 4d   sqliteBtreeGetM
2410: 65 74 61 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d  eta(db->aDb[iDb]
2420: 2e 70 42 74 2c 20 6d 65 74 61 29 3b 0a 20 20 69  .pBt, meta);.  i
2430: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
2440: 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45  iteSetString(pzE
2450: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 5f 65 72  rrMsg, sqlite_er
2460: 72 6f 72 5f 73 74 72 69 6e 67 28 72 63 29 2c 20  ror_string(rc), 
2470: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73  (char*)0);.    s
2480: 71 6c 69 74 65 42 74 72 65 65 43 6c 6f 73 65 43  qliteBtreeCloseC
2490: 75 72 73 6f 72 28 63 75 72 4d 61 69 6e 29 3b 0a  ursor(curMain);.
24a0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24b0: 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 69 44 62   }.  db->aDb[iDb
24c0: 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 20  ].schema_cookie 
24d0: 3d 20 6d 65 74 61 5b 31 5d 3b 0a 20 20 69 66 28  = meta[1];.  if(
24e0: 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 64   iDb==0 ){.    d
24f0: 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65 20 3d  b->next_cookie =
2500: 20 6d 65 74 61 5b 31 5d 3b 0a 20 20 20 20 64 62   meta[1];.    db
2510: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20  ->file_format = 
2520: 6d 65 74 61 5b 32 5d 3b 0a 20 20 20 20 73 69 7a  meta[2];.    siz
2530: 65 20 3d 20 6d 65 74 61 5b 33 5d 3b 0a 20 20 20  e = meta[3];.   
2540: 20 69 66 28 20 73 69 7a 65 3d 3d 30 20 29 7b 20   if( size==0 ){ 
2550: 73 69 7a 65 20 3d 20 4d 41 58 5f 50 41 47 45 53  size = MAX_PAGES
2560: 3b 20 7d 0a 20 20 20 20 64 62 2d 3e 63 61 63 68  ; }.    db->cach
2570: 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 20  e_size = size;. 
2580: 20 20 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65     db->safety_le
2590: 76 65 6c 20 3d 20 6d 65 74 61 5b 34 5d 3b 0a 20  vel = meta[4];. 
25a0: 20 20 20 69 66 28 20 64 62 2d 3e 73 61 66 65 74     if( db->safet
25b0: 79 5f 6c 65 76 65 6c 3d 3d 30 20 29 20 64 62 2d  y_level==0 ) db-
25c0: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
25d0: 32 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  2;..    /*.    *
25e0: 2a 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d  *  file_format==
25f0: 31 20 20 20 20 56 65 72 73 69 6f 6e 20 32 2e 31  1    Version 2.1
2600: 2e 30 2e 0a 20 20 20 20 2a 2a 20 20 66 69 6c 65  .0..    **  file
2610: 5f 66 6f 72 6d 61 74 3d 3d 32 20 20 20 20 56 65  _format==2    Ve
2620: 72 73 69 6f 6e 20 32 2e 32 2e 30 2e 20 41 64 64  rsion 2.2.0. Add
2630: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 49 4e 54   support for INT
2640: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2650: 2e 0a 20 20 20 20 2a 2a 20 20 66 69 6c 65 5f 66  ..    **  file_f
2660: 6f 72 6d 61 74 3d 3d 33 20 20 20 20 56 65 72 73  ormat==3    Vers
2670: 69 6f 6e 20 32 2e 36 2e 30 2e 20 46 69 78 20 65  ion 2.6.0. Fix e
2680: 6d 70 74 79 2d 73 74 72 69 6e 67 20 69 6e 64 65  mpty-string inde
2690: 78 20 62 75 67 2e 0a 20 20 20 20 2a 2a 20 20 66  x bug..    **  f
26a0: 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 34 20 20 20  ile_format==4   
26b0: 20 56 65 72 73 69 6f 6e 20 32 2e 37 2e 30 2e 20   Version 2.7.0. 
26c0: 41 64 64 20 73 75 70 70 6f 72 74 20 66 6f 72 20  Add support for 
26d0: 73 65 70 61 72 61 74 65 20 6e 75 6d 65 72 69 63  separate numeric
26e0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 20   and.    **     
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2700: 65 78 74 20 64 61 74 61 74 79 70 65 73 2e 0a 20  ext datatypes.. 
2710: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
2720: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 30  ->file_format==0
2730: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
2740: 73 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  s happens if the
2750: 20 64 61 74 61 62 61 73 65 20 77 61 73 20 69 6e   database was in
2760: 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 20 2a 2f  itially empty */
2770: 0a 20 20 20 20 20 20 64 62 2d 3e 66 69 6c 65 5f  .      db->file_
2780: 66 6f 72 6d 61 74 20 3d 20 34 3b 0a 20 20 20 20  format = 4;.    
2790: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 69  }else if( db->fi
27a0: 6c 65 5f 66 6f 72 6d 61 74 3e 34 20 29 7b 0a 20  le_format>4 ){. 
27b0: 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65       sqliteBtree
27c0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 63 75 72 4d  CloseCursor(curM
27d0: 61 69 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ain);.      sqli
27e0: 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  teSetString(pzEr
27f0: 72 4d 73 67 2c 20 22 75 6e 73 75 70 70 6f 72 74  rMsg, "unsupport
2800: 65 64 20 66 69 6c 65 20 66 6f 72 6d 61 74 22 2c  ed file format",
2810: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2820: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2830: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
2840: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 69 6c  else if( db->fil
2850: 65 5f 66 6f 72 6d 61 74 21 3d 6d 65 74 61 5b 32  e_format!=meta[2
2860: 5d 20 7c 7c 20 64 62 2d 3e 66 69 6c 65 5f 66 6f  ] || db->file_fo
2870: 72 6d 61 74 3c 34 20 29 7b 0a 20 20 20 20 61 73  rmat<4 ){.    as
2880: 73 65 72 74 28 20 64 62 2d 3e 66 69 6c 65 5f 66  sert( db->file_f
2890: 6f 72 6d 61 74 3e 3d 34 20 29 3b 0a 20 20 20 20  ormat>=4 );.    
28a0: 69 66 28 20 6d 65 74 61 5b 32 5d 3d 3d 30 20 29  if( meta[2]==0 )
28b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
28c0: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
28d0: 2c 20 22 63 61 6e 6e 6f 74 20 61 74 74 61 63 68  , "cannot attach
28e0: 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 3a   empty database:
28f0: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 64 62 2d   ",.         db-
2900: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
2910: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2920: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2930: 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45  iteSetString(pzE
2940: 72 72 4d 73 67 2c 20 22 69 6e 63 6f 6d 70 61 74  rrMsg, "incompat
2950: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
2960: 20 69 6e 20 61 75 78 69 6c 69 61 72 79 20 22 0a   in auxiliary ".
2970: 20 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61           "databa
2980: 73 65 3a 20 22 2c 20 64 62 2d 3e 61 44 62 5b 69  se: ", db->aDb[i
2990: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 28 63 68 61 72  Db].zName, (char
29a0: 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)0);.    }.    
29b0: 73 71 6c 69 74 65 42 74 72 65 65 43 6c 6f 73 65  sqliteBtreeClose
29c0: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  (db->aDb[iDb].pB
29d0: 74 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b  t);.    db->aDb[
29e0: 69 44 62 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20  iDb].pBt = 0;.  
29f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a00: 46 4f 52 4d 41 54 3b 0a 20 20 7d 0a 20 20 73 71  FORMAT;.  }.  sq
2a10: 6c 69 74 65 42 74 72 65 65 53 65 74 43 61 63 68  liteBtreeSetCach
2a20: 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 69 44  eSize(db->aDb[iD
2a30: 62 5d 2e 70 42 74 2c 20 64 62 2d 3e 63 61 63 68  b].pBt, db->cach
2a40: 65 5f 73 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74  e_size);.  sqlit
2a50: 65 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  eBtreeSetSafetyL
2a60: 65 76 65 6c 28 64 62 2d 3e 61 44 62 5b 69 44 62  evel(db->aDb[iDb
2a70: 5d 2e 70 42 74 2c 20 6d 65 74 61 5b 34 5d 3d 3d  ].pBt, meta[4]==
2a80: 30 20 3f 20 32 20 3a 20 6d 65 74 61 5b 34 5d 29  0 ? 2 : meta[4])
2a90: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
2aa0: 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
2ab0: 69 6f 6e 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ion out of the s
2ac0: 63 68 65 6d 61 20 74 61 62 6c 65 73 0a 20 20 2a  chema tables.  *
2ad0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 50 61 72  /.  memset(&sPar
2ae0: 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 50  se, 0, sizeof(sP
2af0: 61 72 73 65 29 29 3b 0a 20 20 73 50 61 72 73 65  arse));.  sParse
2b00: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73 50 61 72  .db = db;.  sPar
2b10: 73 65 2e 78 43 61 6c 6c 62 61 63 6b 20 3d 20 73  se.xCallback = s
2b20: 71 6c 69 74 65 49 6e 69 74 43 61 6c 6c 62 61 63  qliteInitCallbac
2b30: 6b 3b 0a 20 20 73 50 61 72 73 65 2e 70 41 72 67  k;.  sParse.pArg
2b40: 20 3d 20 28 76 6f 69 64 2a 29 26 69 6e 69 74 44   = (void*)&initD
2b50: 61 74 61 3b 0a 20 20 73 50 61 72 73 65 2e 69 6e  ata;.  sParse.in
2b60: 69 74 46 6c 61 67 20 3d 20 31 3b 0a 20 20 73 50  itFlag = 1;.  sP
2b70: 61 72 73 65 2e 75 73 65 43 61 6c 6c 62 61 63 6b  arse.useCallback
2b80: 20 3d 20 31 3b 0a 20 20 69 66 28 20 69 44 62 3d   = 1;.  if( iDb=
2b90: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2ba0: 52 75 6e 50 61 72 73 65 72 28 26 73 50 61 72 73  RunParser(&sPars
2bb0: 65 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 66  e,.        db->f
2bc0: 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 32 20 3f 20  ile_format>=2 ? 
2bd0: 69 6e 69 74 5f 73 63 72 69 70 74 20 3a 20 6f 6c  init_script : ol
2be0: 64 65 72 5f 69 6e 69 74 5f 73 63 72 69 70 74 2c  der_init_script,
2bf0: 0a 20 20 20 20 20 20 20 20 70 7a 45 72 72 4d 73  .        pzErrMs
2c00: 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
2c10: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b   char *zSql = 0;
2c20: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
2c30: 72 69 6e 67 28 26 7a 53 71 6c 2c 20 0a 20 20 20  ring(&zSql, .   
2c40: 20 20 20 20 22 53 45 4c 45 43 54 20 74 79 70 65      "SELECT type
2c50: 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  , name, rootpage
2c60: 2c 20 73 71 6c 2c 20 22 2c 20 7a 44 62 4e 75 6d  , sql, ", zDbNum
2c70: 2c 20 22 20 46 52 4f 4d 20 5c 22 22 2c 0a 20 20  , " FROM \"",.  
2c80: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
2c90: 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 2e 73 71 6c  ].zName, "\".sql
2ca0: 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 28 63 68  ite_master", (ch
2cb0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69  ar*)0);.    sqli
2cc0: 74 65 52 75 6e 50 61 72 73 65 72 28 26 73 50 61  teRunParser(&sPa
2cd0: 72 73 65 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72  rse, zSql, pzErr
2ce0: 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
2cf0: 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  Free(zSql);.  }.
2d00: 20 20 73 71 6c 69 74 65 42 74 72 65 65 43 6c 6f    sqliteBtreeClo
2d10: 73 65 43 75 72 73 6f 72 28 63 75 72 4d 61 69 6e  seCursor(curMain
2d20: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f  );.  if( sqlite_
2d30: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
2d40: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
2d50: 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 22  ring(pzErrMsg, "
2d60: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20  out of memory", 
2d70: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73  (char*)0);.    s
2d80: 50 61 72 73 65 2e 72 63 20 3d 20 53 51 4c 49 54  Parse.rc = SQLIT
2d90: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c  E_NOMEM;.    sql
2da0: 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  iteResetInternal
2db0: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
2dc0: 20 7d 0a 20 20 69 66 28 20 73 50 61 72 73 65 2e   }.  if( sParse.
2dd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2de0: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
2df0: 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 53  ty(db, iDb, DB_S
2e00: 63 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20  chemaLoaded);.  
2e10: 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a    if( iDb==0 ){.
2e20: 20 20 20 20 20 20 44 62 53 65 74 50 72 6f 70 65        DbSetPrope
2e30: 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 53 63  rty(db, 1, DB_Sc
2e40: 68 65 6d 61 4c 6f 61 64 65 64 29 3b 0a 20 20 20  hemaLoaded);.   
2e50: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2e60: 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72  sqliteResetInter
2e70: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 69 44  nalSchema(db, iD
2e80: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
2e90: 20 73 50 61 72 73 65 2e 72 63 3b 0a 7d 0a 0a 2f   sParse.rc;.}../
2ea0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2eb0: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
2ec0: 65 73 20 2d 20 74 68 65 20 6d 61 69 6e 20 64 61  es - the main da
2ed0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
2ee0: 20 66 69 6c 65 0a 2a 2a 20 75 73 65 64 20 74 6f   file.** used to
2ef0: 20 73 74 6f 72 65 20 74 65 6d 70 6f 72 61 72 79   store temporary
2f00: 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 61 6e 79   tables, and any
2f10: 20 61 64 64 69 74 69 6f 6e 61 6c 20 64 61 74 61   additional data
2f20: 62 61 73 65 20 66 69 6c 65 73 0a 2a 2a 20 63 72  base files.** cr
2f30: 65 61 74 65 64 20 75 73 69 6e 67 20 41 54 54 41  eated using ATTA
2f40: 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  CH statements.  
2f50: 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
2f60: 20 63 6f 64 65 2e 20 20 49 66 20 61 6e 0a 2a 2a   code.  If an.**
2f70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
2f80: 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
2f90: 73 73 61 67 65 20 69 6e 74 6f 20 2a 70 7a 45 72  ssage into *pzEr
2fa0: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  rMsg..**.** Afte
2fb0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  r the database i
2fc0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74  s initialized, t
2fd0: 68 65 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61  he SQLITE_Initia
2fe0: 6c 69 7a 65 64 0a 2a 2a 20 62 69 74 20 69 73 20  lized.** bit is 
2ff0: 73 65 74 20 69 6e 20 74 68 65 20 66 6c 61 67 73  set in the flags
3000: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71   field of the sq
3010: 6c 69 74 65 20 73 74 72 75 63 74 75 72 65 2e 20  lite structure. 
3020: 20 41 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 69   An.** attempt i
3030: 73 20 6d 61 64 65 20 74 6f 20 69 6e 69 74 69 61  s made to initia
3040: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  lize the databas
3050: 65 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 0a  e as soon as it.
3060: 2a 2a 20 69 73 20 6f 70 65 6e 65 64 2e 20 20 49  ** is opened.  I
3070: 66 20 74 68 61 74 20 66 61 69 6c 73 20 28 70 65  f that fails (pe
3080: 72 68 61 70 73 20 62 65 63 61 75 73 65 20 61 6e  rhaps because an
3090: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 2a 2a  other process.**
30a0: 20 68 61 73 20 74 68 65 20 73 71 6c 69 74 65 5f   has the sqlite_
30b0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6c 6f 63  master table loc
30c0: 6b 65 64 29 20 74 68 61 6e 20 61 6e 6f 74 68 65  ked) than anothe
30d0: 72 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  r attempt.** is 
30e0: 6d 61 64 65 20 74 68 65 20 66 69 72 73 74 20 74  made the first t
30f0: 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
3100: 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 2a 2f   is accessed..*/
3110: 0a 69 6e 74 20 73 71 6c 69 74 65 49 6e 69 74 28  .int sqliteInit(
3120: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61 72  sqlite *db, char
3130: 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20   **pzErrMsg){.  
3140: 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 0a 20 20  int i, rc;.  .  
3150: 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61  assert( (db->fla
3160: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74  gs & SQLITE_Init
3170: 69 61 6c 69 7a 65 64 29 3d 3d 30 20 29 3b 0a 20  ialized)==0 );. 
3180: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3190: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
31a0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
31b0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
31c0: 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70 65    if( DbHasPrope
31d0: 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 53 63  rty(db, i, DB_Sc
31e0: 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 20 63 6f  hemaLoaded) ) co
31f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
3200: 72 74 28 20 69 21 3d 31 20 29 3b 20 20 2f 2a 20  rt( i!=1 );  /* 
3210: 53 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  Should have been
3220: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 67   initialized tog
3230: 65 74 68 65 72 20 77 69 74 68 20 30 20 2a 2f 0a  ether with 0 */.
3240: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 49      rc = sqliteI
3250: 6e 69 74 4f 6e 65 28 64 62 2c 20 69 2c 20 70 7a  nitOne(db, i, pz
3260: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28  ErrMsg);.    if(
3270: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   rc ){.      sql
3280: 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  iteResetInternal
3290: 53 63 68 65 6d 61 28 64 62 2c 20 69 29 3b 0a 20  Schema(db, i);. 
32a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
32b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32c0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
32d0: 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69   SQLITE_Initiali
32e0: 7a 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 43  zed;.    sqliteC
32f0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3300: 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  nges(db);.  }.. 
3310: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
3320: 61 73 65 20 69 73 20 69 6e 20 66 6f 72 6d 61 74  ase is in format
3330: 73 20 31 20 6f 72 20 32 2c 20 74 68 65 6e 20 75  s 1 or 2, then u
3340: 70 67 72 61 64 65 20 69 74 20 74 6f 0a 20 20 2a  pgrade it to.  *
3350: 2a 20 76 65 72 73 69 6f 6e 20 33 2e 20 20 54 68  * version 3.  Th
3360: 69 73 20 77 69 6c 6c 20 72 65 63 6f 6e 73 74 72  is will reconstr
3370: 75 63 74 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e  uct all indices.
3380: 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 75 70    If the.  ** up
3390: 67 72 61 64 65 20 66 61 69 6c 73 20 66 6f 72 20  grade fails for 
33a0: 61 6e 79 20 72 65 61 73 6f 6e 20 28 65 78 3a 20  any reason (ex: 
33b0: 6f 75 74 20 6f 66 20 64 69 73 6b 20 73 70 61 63  out of disk spac
33c0: 65 2c 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  e, database.  **
33d0: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 2c 20 69   is read only, i
33e0: 6e 74 65 72 72 75 70 74 20 72 65 63 65 69 76 65  nterrupt receive
33f0: 64 2c 20 65 74 63 2e 29 20 74 68 65 6e 20 66 61  d, etc.) then fa
3400: 69 6c 20 74 68 65 20 69 6e 69 74 2e 0a 20 20 2a  il the init..  *
3410: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
3420: 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 69 6c  TE_OK && db->fil
3430: 65 5f 66 6f 72 6d 61 74 3c 33 20 29 7b 0a 20 20  e_format<3 ){.  
3440: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
3450: 3b 0a 20 20 20 20 49 6e 69 74 44 61 74 61 20 69  ;.    InitData i
3460: 6e 69 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74  nitData;.    int
3470: 20 6d 65 74 61 5b 53 51 4c 49 54 45 5f 4e 5f 42   meta[SQLITE_N_B
3480: 54 52 45 45 5f 4d 45 54 41 5d 3b 0a 0a 20 20 20  TREE_META];..   
3490: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
34a0: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
34b0: 20 20 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20      initData.db 
34c0: 3d 20 64 62 3b 0a 20 20 20 20 69 6e 69 74 44 61  = db;.    initDa
34d0: 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 7a  ta.pzErrMsg = &z
34e0: 45 72 72 3b 0a 20 20 20 20 64 62 2d 3e 66 69 6c  Err;.    db->fil
34f0: 65 5f 66 6f 72 6d 61 74 20 3d 20 33 3b 0a 20 20  e_format = 3;.  
3500: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 65 78    rc = sqlite_ex
3510: 65 63 28 64 62 2c 0a 20 20 20 20 20 20 22 42 45  ec(db,.      "BE
3520: 47 49 4e 3b 20 53 45 4c 45 43 54 20 6e 61 6d 65  GIN; SELECT name
3530: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
3540: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27  ter WHERE type='
3550: 74 61 62 6c 65 27 3b 22 2c 0a 20 20 20 20 20 20  table';",.      
3560: 75 70 67 72 61 64 65 5f 33 5f 63 61 6c 6c 62 61  upgrade_3_callba
3570: 63 6b 2c 0a 20 20 20 20 20 20 26 69 6e 69 74 44  ck,.      &initD
3580: 61 74 61 2c 0a 20 20 20 20 20 20 26 7a 45 72 72  ata,.      &zErr
3590: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
35a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35b0: 20 20 73 71 6c 69 74 65 42 74 72 65 65 47 65 74    sqliteBtreeGet
35c0: 4d 65 74 61 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Meta(db->aDb[0].
35d0: 70 42 74 2c 20 6d 65 74 61 29 3b 0a 20 20 20 20  pBt, meta);.    
35e0: 20 20 6d 65 74 61 5b 32 5d 20 3d 20 34 3b 0a 20    meta[2] = 4;. 
35f0: 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65       sqliteBtree
3600: 55 70 64 61 74 65 4d 65 74 61 28 64 62 2d 3e 61  UpdateMeta(db->a
3610: 44 62 5b 30 5d 2e 70 42 74 2c 20 6d 65 74 61 29  Db[0].pBt, meta)
3620: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f 65  ;.      sqlite_e
3630: 78 65 63 28 64 62 2c 20 22 43 4f 4d 4d 49 54 22  xec(db, "COMMIT"
3640: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
3650: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
3660: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
3670: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
3680: 28 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20 20  (pzErrMsg, .    
3690: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 75      "unable to u
36a0: 70 67 72 61 64 65 20 64 61 74 61 62 61 73 65 20  pgrade database 
36b0: 74 6f 20 74 68 65 20 76 65 72 73 69 6f 6e 20 32  to the version 2
36c0: 2e 36 20 66 6f 72 6d 61 74 22 2c 0a 20 20 20 20  .6 format",.    
36d0: 20 20 20 20 7a 45 72 72 20 3f 20 22 3a 20 22 20      zErr ? ": " 
36e0: 3a 20 30 2c 20 7a 45 72 72 2c 20 28 63 68 61 72  : 0, zErr, (char
36f0: 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)0);.    }.    
3700: 73 71 6c 69 74 65 5f 66 72 65 65 6d 65 6d 28 7a  sqlite_freemem(z
3710: 45 72 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Err);.  }..  if(
3720: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3730: 7b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  {.    db->flags 
3740: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 69 74 69  &= ~SQLITE_Initi
3750: 61 6c 69 7a 65 64 3b 0a 20 20 7d 0a 20 20 72 65  alized;.  }.  re
3760: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3770: 2a 20 54 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  * The version of
3780: 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2f 0a   the library.*/.
3790: 63 6f 6e 73 74 20 63 68 61 72 20 72 63 73 69 64  const char rcsid
37a0: 5b 5d 20 3d 20 22 40 28 23 29 20 5c 30 34 34 49  [] = "@(#) \044I
37b0: 64 3a 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f  d: SQLite versio
37c0: 6e 20 22 20 53 51 4c 49 54 45 5f 56 45 52 53 49  n " SQLITE_VERSI
37d0: 4f 4e 20 22 20 24 22 3b 0a 63 6f 6e 73 74 20 63  ON " $";.const c
37e0: 68 61 72 20 73 71 6c 69 74 65 5f 76 65 72 73 69  har sqlite_versi
37f0: 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45  on[] = SQLITE_VE
3800: 52 53 49 4f 4e 3b 0a 0a 2f 2a 0a 2a 2a 20 44 6f  RSION;../*.** Do
3810: 65 73 20 74 68 65 20 6c 69 62 72 61 72 79 20 65  es the library e
3820: 78 70 65 63 74 20 64 61 74 61 20 74 6f 20 62 65  xpect data to be
3830: 20 65 6e 63 6f 64 65 64 20 61 73 20 55 54 46 2d   encoded as UTF-
3840: 38 20 6f 72 20 69 73 6f 38 38 35 39 3f 20 20 54  8 or iso8859?  T
3850: 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
3860: 67 6c 6f 62 61 6c 20 63 6f 6e 73 74 61 6e 74 20  global constant 
3870: 61 6c 77 61 79 73 20 6c 65 74 73 20 75 73 20 6b  always lets us k
3880: 6e 6f 77 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  now..*/.#ifdef S
3890: 51 4c 49 54 45 5f 55 54 46 38 0a 63 6f 6e 73 74  QLITE_UTF8.const
38a0: 20 63 68 61 72 20 73 71 6c 69 74 65 5f 65 6e 63   char sqlite_enc
38b0: 6f 64 69 6e 67 5b 5d 20 3d 20 22 55 54 46 2d 38  oding[] = "UTF-8
38c0: 22 3b 0a 23 65 6c 73 65 0a 63 6f 6e 73 74 20 63  ";.#else.const c
38d0: 68 61 72 20 73 71 6c 69 74 65 5f 65 6e 63 6f 64  har sqlite_encod
38e0: 69 6e 67 5b 5d 20 3d 20 22 69 73 6f 38 38 35 39  ing[] = "iso8859
38f0: 22 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ";.#endif../*.**
3900: 20 4f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69   Open a new SQLi
3910: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 6f  te database.  Co
3920: 6e 73 74 72 75 63 74 20 61 6e 20 22 73 71 6c 69  nstruct an "sqli
3930: 74 65 22 20 73 74 72 75 63 74 75 72 65 20 74 6f  te" structure to
3940: 20 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 73   define.** the s
3950: 74 61 74 65 20 6f 66 20 74 68 69 73 20 64 61 74  tate of this dat
3960: 61 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e  abase and return
3970: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3980: 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  at structure..**
3990: 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 69  .** An attempt i
39a0: 73 20 6d 61 64 65 20 74 6f 20 69 6e 69 74 69 61  s made to initia
39b0: 6c 69 7a 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lize the in-memo
39c0: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
39d0: 65 73 20 74 68 61 74 0a 2a 2a 20 68 6f 6c 64 20  es that.** hold 
39e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
39f0: 65 6d 61 2e 20 20 42 75 74 20 69 66 20 74 68 69  ema.  But if thi
3a00: 73 20 66 61 69 6c 73 20 28 62 65 63 61 75 73 65  s fails (because
3a10: 20 74 68 65 20 73 63 68 65 6d 61 20 66 69 6c 65   the schema file
3a20: 0a 2a 2a 20 69 73 20 6c 6f 63 6b 65 64 29 20 74  .** is locked) t
3a30: 68 65 6e 20 74 68 61 74 20 73 74 65 70 20 69 73  hen that step is
3a40: 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
3a50: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
3a60: 6f 0a 2a 2a 20 73 71 6c 69 74 65 5f 65 78 65 63  o.** sqlite_exec
3a70: 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 20 2a 73  ()..*/.sqlite *s
3a80: 71 6c 69 74 65 5f 6f 70 65 6e 28 63 6f 6e 73 74  qlite_open(const
3a90: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
3aa0: 2c 20 69 6e 74 20 6d 6f 64 65 2c 20 63 68 61 72  , int mode, char
3ab0: 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20   **pzErrMsg){.  
3ac0: 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 69 6e  sqlite *db;.  in
3ad0: 74 20 72 63 2c 20 69 3b 0a 0a 20 20 2f 2a 20 41  t rc, i;..  /* A
3ae0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
3af0: 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
3b00: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
3b10: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
3b20: 28 73 71 6c 69 74 65 29 20 29 3b 0a 20 20 69 66  (sqlite) );.  if
3b30: 28 20 70 7a 45 72 72 4d 73 67 20 29 20 2a 70 7a  ( pzErrMsg ) *pz
3b40: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 66  ErrMsg = 0;.  if
3b50: 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  ( db==0 ) goto n
3b60: 6f 5f 6d 65 6d 5f 6f 6e 5f 6f 70 65 6e 3b 0a 20  o_mem_on_open;. 
3b70: 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 4f   db->onError = O
3b80: 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 64 62 2d  E_Default;.  db-
3b90: 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 20 3d  >priorNewRowid =
3ba0: 20 30 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   0;.  db->magic 
3bb0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
3bc0: 55 53 59 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  USY;.  db->nDb =
3bd0: 20 32 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20   2;.  db->aDb = 
3be0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
3bf0: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28   sqliteHashInit(
3c00: 26 64 62 2d 3e 61 46 75 6e 63 2c 20 53 51 4c 49  &db->aFunc, SQLI
3c10: 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  TE_HASH_STRING, 
3c20: 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1);.  for(i=0; i
3c30: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3c40: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
3c50: 69 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74  it(&db->aDb[i].t
3c60: 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  blHash, SQLITE_H
3c70: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
3c80: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
3c90: 69 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 69  it(&db->aDb[i].i
3ca0: 64 78 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48  dxHash, SQLITE_H
3cb0: 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a  ASH_STRING, 0);.
3cc0: 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e      sqliteHashIn
3cd0: 69 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e 74  it(&db->aDb[i].t
3ce0: 72 69 67 48 61 73 68 2c 20 53 51 4c 49 54 45 5f  rigHash, SQLITE_
3cf0: 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b  HASH_STRING, 0);
3d00: 0a 20 20 20 20 73 71 6c 69 74 65 48 61 73 68 49  .    sqliteHashI
3d10: 6e 69 74 28 26 64 62 2d 3e 61 44 62 5b 69 5d 2e  nit(&db->aDb[i].
3d20: 61 46 4b 65 79 2c 20 53 51 4c 49 54 45 5f 48 41  aFKey, SQLITE_HA
3d30: 53 48 5f 53 54 52 49 4e 47 2c 20 31 29 3b 0a 20  SH_STRING, 1);. 
3d40: 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 70 65 6e 20   }.  .  /* Open 
3d50: 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
3d60: 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
3d70: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30   if( zFilename[0
3d80: 5d 3d 3d 27 3a 27 20 26 26 20 73 74 72 63 6d 70  ]==':' && strcmp
3d90: 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
3da0: 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
3db0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
3dc0: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 2;.  }.  rc = 
3dd0: 73 71 6c 69 74 65 42 74 72 65 65 46 61 63 74 6f  sqliteBtreeFacto
3de0: 72 79 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65  ry(db, zFilename
3df0: 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53 2c 20  , 0, MAX_PAGES, 
3e00: 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  &db->aDb[0].pBt)
3e10: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3e20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 77 69  TE_OK ){.    swi
3e30: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20  tch( rc ){.     
3e40: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
3e50: 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72      sqliteSetStr
3e60: 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 75  ing(pzErrMsg, "u
3e70: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
3e80: 74 61 62 61 73 65 3a 20 22 2c 0a 20 20 20 20 20  tabase: ",.     
3e90: 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
3ea0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
3eb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
3ec0: 6c 69 74 65 46 72 65 65 28 64 62 29 3b 0a 20 20  liteFree(db);.  
3ed0: 20 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c 6c    sqliteStrReall
3ee0: 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  oc(pzErrMsg);.  
3ef0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3f00: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
3f10: 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
3f20: 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20  b->aDb[1].zName 
3f30: 3d 20 22 74 65 6d 70 22 3b 0a 0a 20 20 2f 2a 20  = "temp";..  /* 
3f40: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  Attempt to read 
3f50: 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
3f60: 73 71 6c 69 74 65 52 65 67 69 73 74 65 72 42 75  sqliteRegisterBu
3f70: 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64  iltinFunctions(d
3f80: 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
3f90: 65 49 6e 69 74 28 64 62 2c 20 70 7a 45 72 72 4d  eInit(db, pzErrM
3fa0: 73 67 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  sg);.  db->magic
3fb0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
3fc0: 4f 50 45 4e 3b 0a 20 20 69 66 28 20 73 71 6c 69  OPEN;.  if( sqli
3fd0: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
3fe0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 63   ){.    sqlite_c
3ff0: 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 67 6f  lose(db);.    go
4000: 74 6f 20 6e 6f 5f 6d 65 6d 5f 6f 6e 5f 6f 70 65  to no_mem_on_ope
4010: 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  n;.  }else if( r
4020: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
4030: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
4040: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 63 6c  ){.    sqlite_cl
4050: 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  ose(db);.    sql
4060: 69 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a  iteStrRealloc(pz
4070: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
4080: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  urn 0;.  }else i
4090: 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
40a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
40b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70  zErrMsg);.    *p
40c0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
40d0: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
40e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
40f0: 65 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61  ewly opened data
4100: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a  base structure *
4110: 2f 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a 0a  /.  return db;..
4120: 6e 6f 5f 6d 65 6d 5f 6f 6e 5f 6f 70 65 6e 3a 0a  no_mem_on_open:.
4130: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
4140: 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74  g(pzErrMsg, "out
4150: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 28 63 68   of memory", (ch
4160: 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65  ar*)0);.  sqlite
4170: 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72  StrRealloc(pzErr
4180: 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Msg);.  return 0
4190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
41a0: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
41b0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
41c0: 6e 73 65 72 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nsert.*/.int sql
41d0: 69 74 65 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  ite_last_insert_
41e0: 72 6f 77 69 64 28 73 71 6c 69 74 65 20 2a 64 62  rowid(sqlite *db
41f0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
4200: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
4210: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
4220: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
4230: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
4240: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
4250: 74 65 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e  te_exec()..*/.in
4260: 74 20 73 71 6c 69 74 65 5f 63 68 61 6e 67 65 73  t sqlite_changes
4270: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
4280: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
4290: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
42a0: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53  se an existing S
42b0: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a  QLite database.*
42c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 63 6c  /.void sqlite_cl
42d0: 6f 73 65 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  ose(sqlite *db){
42e0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a  .  HashElem *i;.
42f0: 20 20 69 6e 74 20 6a 3b 0a 20 20 64 62 2d 3e 77    int j;.  db->w
4300: 61 6e 74 5f 74 6f 5f 63 6c 6f 73 65 20 3d 20 31  ant_to_close = 1
4310: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 61  ;.  if( sqliteSa
4320: 66 65 74 79 43 68 65 63 6b 28 64 62 29 20 7c 7c  fetyCheck(db) ||
4330: 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 6e 28   sqliteSafetyOn(
4340: 64 62 29 20 29 7b 0a 20 20 20 20 2f 2a 20 70 72  db) ){.    /* pr
4350: 69 6e 74 66 28 22 44 49 44 20 4e 4f 54 20 43 4c  intf("DID NOT CL
4360: 4f 53 45 5c 6e 22 29 3b 20 66 66 6c 75 73 68 28  OSE\n"); fflush(
4370: 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20  stdout); */.    
4380: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62  return;.  }.  db
4390: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
43a0: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
43b0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
43c0: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  nDb; j++){.    i
43d0: 66 28 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42  f( db->aDb[j].pB
43e0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
43f0: 65 42 74 72 65 65 43 6c 6f 73 65 28 64 62 2d 3e  eBtreeClose(db->
4400: 61 44 62 5b 6a 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[j].pBt);.   
4410: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42     db->aDb[j].pB
4420: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
4430: 20 69 66 28 20 6a 3e 3d 32 20 29 7b 0a 20 20 20   if( j>=2 ){.   
4440: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62     sqliteFree(db
4450: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b  ->aDb[j].zName);
4460: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
4470: 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
4480: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 52   }.  }.  sqliteR
4490: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
44a0: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 61 73 73  ma(db, 0);.  ass
44b0: 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20  ert( db->nDb<=2 
44c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
44d0: 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb==db->aDbSta
44e0: 74 69 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 73  tic );.  for(i=s
44f0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
4500: 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69  db->aFunc); i; i
4510: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
4520: 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  i)){.    FuncDef
4530: 20 2a 70 46 75 6e 63 2c 20 2a 70 4e 65 78 74 3b   *pFunc, *pNext;
4540: 0a 20 20 20 20 66 6f 72 28 70 46 75 6e 63 20 3d  .    for(pFunc =
4550: 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74   (FuncDef*)sqlit
4560: 65 48 61 73 68 44 61 74 61 28 69 29 3b 20 70 46  eHashData(i); pF
4570: 75 6e 63 3b 20 70 46 75 6e 63 3d 70 4e 65 78 74  unc; pFunc=pNext
4580: 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  ){.      pNext =
4590: 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 3b 0a 20   pFunc->pNext;. 
45a0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
45b0: 70 46 75 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20  pFunc);.    }.  
45c0: 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  }.  sqliteHashCl
45d0: 65 61 72 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b  ear(&db->aFunc);
45e0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 64 62  .  sqliteFree(db
45f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
4600: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
4610: 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e files..*/.void
4620: 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 41   sqliteRollbackA
4630: 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  ll(sqlite *db){.
4640: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
4650: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
4660: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
4670: 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20  >aDb[i].pBt ){. 
4680: 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65       sqliteBtree
4690: 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44 62  Rollback(db->aDb
46a0: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20  [i].pBt);.      
46b0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61  db->aDb[i].inTra
46c0: 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ns = 0;.    }.  
46d0: 7d 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 49  }.  sqliteResetI
46e0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
46f0: 2c 20 30 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74  , 0);.  /* sqlit
4700: 65 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61  eRollbackInterna
4710: 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 20 2a 2f  lChanges(db); */
4720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4730: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
4740: 77 6f 72 6b 20 6f 66 20 65 69 74 68 65 72 20 73  work of either s
4750: 71 6c 69 74 65 5f 65 78 65 63 28 29 20 6f 72 20  qlite_exec() or 
4760: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 28 29  sqlite_compile()
4770: 2e 0a 2a 2a 20 49 74 20 77 6f 72 6b 73 20 6c 69  ..** It works li
4780: 6b 65 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29  ke sqlite_exec()
4790: 20 69 66 20 70 56 6d 3d 3d 4e 55 4c 4c 20 61 6e   if pVm==NULL an
47a0: 64 20 69 74 20 77 6f 72 6b 73 20 6c 69 6b 65 20  d it works like 
47b0: 73 71 6c 69 74 65 5f 63 6f 6d 70 69 6c 65 28 29  sqlite_compile()
47c0: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
47d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
47e0: 69 74 65 4d 61 69 6e 28 0a 20 20 73 71 6c 69 74  iteMain(.  sqlit
47f0: 65 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  e *db,          
4800: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
4810: 74 61 62 61 73 65 20 6f 6e 20 77 68 69 63 68 20  tabase on which 
4820: 74 68 65 20 53 51 4c 20 65 78 65 63 75 74 65 73  the SQL executes
4830: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4840: 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
4850: 20 20 2f 2a 20 54 68 65 20 53 51 4c 20 74 6f 20    /* The SQL to 
4860: 62 65 20 65 78 65 63 75 74 65 64 20 2a 2f 0a 20  be executed */. 
4870: 20 73 71 6c 69 74 65 5f 63 61 6c 6c 62 61 63 6b   sqlite_callback
4880: 20 78 43 61 6c 6c 62 61 63 6b 2c 20 20 2f 2a 20   xCallback,  /* 
4890: 49 6e 76 6f 6b 65 20 74 68 69 73 20 63 61 6c 6c  Invoke this call
48a0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
48b0: 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20    void *pArg,   
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
48d0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
48e0: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
48f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4900: 2a 70 7a 54 61 69 6c 2c 20 20 20 20 20 20 20 20  *pzTail,        
4910: 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 73 74 61  /* OUT: Next sta
4920: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
4930: 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69   first */.  sqli
4940: 74 65 5f 76 6d 20 2a 2a 70 70 56 6d 2c 20 20 20  te_vm **ppVm,   
4950: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
4960: 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
4970: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ine */.  char **
4980: 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
4990: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69       /* OUT: Wri
49a0: 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
49b0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 50  s here */.){.  P
49c0: 61 72 73 65 20 73 50 61 72 73 65 3b 0a 0a 20 20  arse sParse;..  
49d0: 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 20 2a  if( pzErrMsg ) *
49e0: 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  pzErrMsg = 0;.  
49f0: 69 66 28 20 73 71 6c 69 74 65 53 61 66 65 74 79  if( sqliteSafety
4a00: 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20 65 78  On(db) ) goto ex
4a10: 65 63 5f 6d 69 73 75 73 65 3b 0a 20 20 69 66 28  ec_misuse;.  if(
4a20: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
4a30: 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64  LITE_Initialized
4a40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
4a50: 72 63 2c 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20  rc, cnt = 1;.   
4a60: 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
4a70: 6c 69 74 65 49 6e 69 74 28 64 62 2c 20 70 7a 45  liteInit(db, pzE
4a80: 72 72 4d 73 67 29 29 3d 3d 53 51 4c 49 54 45 5f  rrMsg))==SQLITE_
4a90: 42 55 53 59 0a 20 20 20 20 20 20 20 26 26 20 64  BUSY.       && d
4aa0: 62 2d 3e 78 42 75 73 79 43 61 6c 6c 62 61 63 6b  b->xBusyCallback
4ab0: 20 26 26 20 64 62 2d 3e 78 42 75 73 79 43 61 6c   && db->xBusyCal
4ac0: 6c 62 61 63 6b 28 64 62 2d 3e 70 42 75 73 79 41  lback(db->pBusyA
4ad0: 72 67 2c 20 22 22 2c 20 63 6e 74 2b 2b 29 21 3d  rg, "", cnt++)!=
4ae0: 30 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  0 ){}.    if( rc
4af0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4b00: 20 20 20 20 20 73 71 6c 69 74 65 53 74 72 52 65       sqliteStrRe
4b10: 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b  alloc(pzErrMsg);
4b20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 61 66  .      sqliteSaf
4b30: 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20  etyOff(db);.    
4b40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
4b50: 20 7d 0a 20 20 20 20 69 66 28 20 70 7a 45 72 72   }.    if( pzErr
4b60: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
4b70: 69 74 65 46 72 65 65 28 2a 70 7a 45 72 72 4d 73  iteFree(*pzErrMs
4b80: 67 29 3b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72  g);.      *pzErr
4b90: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Msg = 0;.    }. 
4ba0: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 66 69 6c   }.  if( db->fil
4bb0: 65 5f 66 6f 72 6d 61 74 3c 33 20 29 7b 0a 20 20  e_format<3 ){.  
4bc0: 20 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 66    sqliteSafetyOf
4bd0: 66 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  f(db);.    sqlit
4be0: 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  eSetString(pzErr
4bf0: 4d 73 67 2c 20 22 6f 62 73 6f 6c 65 74 65 20 64  Msg, "obsolete d
4c00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
4c10: 6d 61 74 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  mat", (char*)0);
4c20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4c30: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
4c40: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 30  if( db->pVdbe==0
4c50: 20 29 7b 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20   ){ db->nChange 
4c60: 3d 20 30 3b 20 7d 0a 20 20 6d 65 6d 73 65 74 28  = 0; }.  memset(
4c70: 26 73 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65  &sParse, 0, size
4c80: 6f 66 28 73 50 61 72 73 65 29 29 3b 0a 20 20 73  of(sParse));.  s
4c90: 50 61 72 73 65 2e 64 62 20 3d 20 64 62 3b 0a 20  Parse.db = db;. 
4ca0: 20 73 50 61 72 73 65 2e 78 43 61 6c 6c 62 61 63   sParse.xCallbac
4cb0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
4cc0: 20 73 50 61 72 73 65 2e 70 41 72 67 20 3d 20 70   sParse.pArg = p
4cd0: 41 72 67 3b 0a 20 20 73 50 61 72 73 65 2e 75 73  Arg;.  sParse.us
4ce0: 65 43 61 6c 6c 62 61 63 6b 20 3d 20 70 70 56 6d  eCallback = ppVm
4cf0: 3d 3d 30 3b 0a 20 20 69 66 28 20 64 62 2d 3e 78  ==0;.  if( db->x
4d00: 54 72 61 63 65 20 29 20 64 62 2d 3e 78 54 72 61  Trace ) db->xTra
4d10: 63 65 28 64 62 2d 3e 70 54 72 61 63 65 41 72 67  ce(db->pTraceArg
4d20: 2c 20 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  , zSql);.  sqlit
4d30: 65 52 75 6e 50 61 72 73 65 72 28 26 73 50 61 72  eRunParser(&sPar
4d40: 73 65 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d  se, zSql, pzErrM
4d50: 73 67 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  sg);.  if( sqlit
4d60: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
4d70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
4d80: 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c  String(pzErrMsg,
4d90: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
4da0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
4db0: 20 73 50 61 72 73 65 2e 72 63 20 3d 20 53 51 4c   sParse.rc = SQL
4dc0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73  ITE_NOMEM;.    s
4dd0: 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 41 6c 6c  qliteRollbackAll
4de0: 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
4df0: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
4e00: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ema(db, 0);.    
4e10: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
4e20: 4c 49 54 45 5f 49 6e 54 72 61 6e 73 3b 0a 20 20  LITE_InTrans;.  
4e30: 7d 0a 20 20 69 66 28 20 73 50 61 72 73 65 2e 72  }.  if( sParse.r
4e40: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
4e50: 20 73 50 61 72 73 65 2e 72 63 20 3d 20 53 51 4c   sParse.rc = SQL
4e60: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 73 50  ITE_OK;.  if( sP
4e70: 61 72 73 65 2e 72 63 21 3d 53 51 4c 49 54 45 5f  arse.rc!=SQLITE_
4e80: 4f 4b 20 26 26 20 70 7a 45 72 72 4d 73 67 20 26  OK && pzErrMsg &
4e90: 26 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29  & *pzErrMsg==0 )
4ea0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
4eb0: 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20  tring(pzErrMsg, 
4ec0: 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74 72  sqlite_error_str
4ed0: 69 6e 67 28 73 50 61 72 73 65 2e 72 63 29 2c 20  ing(sParse.rc), 
4ee0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20  (char*)0);.  }. 
4ef0: 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c 6c 6f   sqliteStrReallo
4f00: 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  c(pzErrMsg);.  i
4f10: 66 28 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51  f( sParse.rc==SQ
4f20: 4c 49 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20  LITE_SCHEMA ){. 
4f30: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e     sqliteResetIn
4f40: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
4f50: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73   0);.  }.  if( s
4f60: 50 61 72 73 65 2e 75 73 65 43 61 6c 6c 62 61 63  Parse.useCallbac
4f70: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  k==0 ){.    asse
4f80: 72 74 28 20 70 70 56 6d 20 29 3b 0a 20 20 20 20  rt( ppVm );.    
4f90: 2a 70 70 56 6d 20 3d 20 28 73 71 6c 69 74 65 5f  *ppVm = (sqlite_
4fa0: 76 6d 2a 29 73 50 61 72 73 65 2e 70 56 64 62 65  vm*)sParse.pVdbe
4fb0: 3b 0a 20 20 20 20 69 66 28 20 70 7a 54 61 69 6c  ;.    if( pzTail
4fc0: 20 29 20 2a 70 7a 54 61 69 6c 20 3d 20 73 50 61   ) *pzTail = sPa
4fd0: 72 73 65 2e 7a 54 61 69 6c 3b 0a 20 20 7d 0a 20  rse.zTail;.  }. 
4fe0: 20 69 66 28 20 73 71 6c 69 74 65 53 61 66 65 74   if( sqliteSafet
4ff0: 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74 6f 20  yOff(db) ) goto 
5000: 65 78 65 63 5f 6d 69 73 75 73 65 3b 0a 20 20 72  exec_misuse;.  r
5010: 65 74 75 72 6e 20 73 50 61 72 73 65 2e 72 63 3b  eturn sParse.rc;
5020: 0a 0a 65 78 65 63 5f 6d 69 73 75 73 65 3a 0a 20  ..exec_misuse:. 
5030: 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b   if( pzErrMsg ){
5040: 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
5050: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   0;.    sqliteSe
5060: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
5070: 2c 20 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73  , sqlite_error_s
5080: 74 72 69 6e 67 28 53 51 4c 49 54 45 5f 4d 49 53  tring(SQLITE_MIS
5090: 55 53 45 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  USE), (char*)0);
50a0: 0a 20 20 20 20 73 71 6c 69 74 65 53 74 72 52 65  .    sqliteStrRe
50b0: 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b  alloc(pzErrMsg);
50c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
50d0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 0a  LITE_MISUSE;.}..
50e0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 53 51  /*.** Execute SQ
50f0: 4c 20 63 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  L code.  Return 
5100: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
5110: 45 5f 20 73 75 63 63 65 73 73 2f 66 61 69 6c 75  E_ success/failu
5120: 72 65 0a 2a 2a 20 63 6f 64 65 73 2e 20 20 41 6c  re.** codes.  Al
5130: 73 6f 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f  so write an erro
5140: 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 6d  r message into m
5150: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5160: 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20  rom.** malloc() 
5170: 61 6e 64 20 6d 61 6b 65 20 2a 70 7a 45 72 72 4d  and make *pzErrM
5180: 73 67 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  sg point to that
5190: 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
51a0: 49 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 20  If the SQL is a 
51b0: 71 75 65 72 79 2c 20 74 68 65 6e 20 66 6f 72 20  query, then for 
51c0: 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
51d0: 71 75 65 72 79 20 72 65 73 75 6c 74 0a 2a 2a 20  query result.** 
51e0: 74 68 65 20 78 43 61 6c 6c 62 61 63 6b 28 29 20  the xCallback() 
51f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
5200: 65 64 2e 20 20 70 41 72 67 20 62 65 63 6f 6d 65  ed.  pArg become
5210: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
5220: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 61 6c 6c  rgument to xCall
5230: 62 61 63 6b 28 29 2e 20 20 49 66 20 78 43 61 6c  back().  If xCal
5240: 6c 62 61 63 6b 3d 4e 55 4c 4c 20 74 68 65 6e 20  lback=NULL then 
5250: 6e 6f 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 69  no callback.** i
5260: 73 20 69 6e 76 6f 6b 65 64 2c 20 65 76 65 6e 20  s invoked, even 
5270: 66 6f 72 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a  for queries..*/.
5280: 69 6e 74 20 73 71 6c 69 74 65 5f 65 78 65 63 28  int sqlite_exec(
5290: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20  .  sqlite *db,  
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
52b0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
52c0: 6e 20 77 68 69 63 68 20 74 68 65 20 53 51 4c 20  n which the SQL 
52d0: 65 78 65 63 75 74 65 73 20 2a 2f 0a 20 20 63 6f  executes */.  co
52e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
52f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5300: 20 53 51 4c 20 74 6f 20 62 65 20 65 78 65 63 75   SQL to be execu
5310: 74 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  ted */.  sqlite_
5320: 63 61 6c 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61  callback xCallba
5330: 63 6b 2c 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ck,  /* Invoke t
5340: 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  his callback rou
5350: 74 69 6e 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tine */.  void *
5360: 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
5370: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
5380: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 61 6c 6c  rgument to xCall
5390: 62 61 63 6b 28 29 20 2a 2f 0a 20 20 63 68 61 72  back() */.  char
53a0: 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20   **pzErrMsg     
53b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
53c0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
53d0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  here */.){.  ret
53e0: 75 72 6e 20 73 71 6c 69 74 65 4d 61 69 6e 28 64  urn sqliteMain(d
53f0: 62 2c 20 7a 53 71 6c 2c 20 78 43 61 6c 6c 62 61  b, zSql, xCallba
5400: 63 6b 2c 20 70 41 72 67 2c 20 30 2c 20 30 2c 20  ck, pArg, 0, 0, 
5410: 70 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a  pzErrMsg);.}../*
5420: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 61 20 73 69  .** Compile a si
5430: 6e 67 6c 65 20 73 74 61 74 65 6d 65 6e 74 20 6f  ngle statement o
5440: 66 20 53 51 4c 20 69 6e 74 6f 20 61 20 76 69 72  f SQL into a vir
5450: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 52  tual machine.  R
5460: 65 74 75 72 6e 20 6f 6e 65 0a 2a 2a 20 6f 66 20  eturn one.** of 
5470: 74 68 65 20 53 51 4c 49 54 45 5f 20 73 75 63 63  the SQLITE_ succ
5480: 65 73 73 2f 66 61 69 6c 75 72 65 20 63 6f 64 65  ess/failure code
5490: 73 2e 20 20 41 6c 73 6f 20 77 72 69 74 65 20 61  s.  Also write a
54a0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
54b0: 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f  into.** memory o
54c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
54d0: 6c 6f 63 28 29 20 61 6e 64 20 6d 61 6b 65 20 2a  loc() and make *
54e0: 70 7a 45 72 72 4d 73 67 20 70 6f 69 6e 74 20 74  pzErrMsg point t
54f0: 6f 20 74 68 61 74 20 6d 65 73 73 61 67 65 2e 0a  o that message..
5500: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 63 6f  */.int sqlite_co
5510: 6d 70 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 20  mpile(.  sqlite 
5520: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
5530: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
5540: 62 61 73 65 20 6f 6e 20 77 68 69 63 68 20 74 68  base on which th
5550: 65 20 53 51 4c 20 65 78 65 63 75 74 65 73 20 2a  e SQL executes *
5560: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5570: 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20  zSql,           
5580: 2f 2a 20 54 68 65 20 53 51 4c 20 74 6f 20 62 65  /* The SQL to be
5590: 20 65 78 65 63 75 74 65 64 20 2a 2f 0a 20 20 63   executed */.  c
55a0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61  onst char **pzTa
55b0: 69 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  il,        /* OU
55c0: 54 3a 20 4e 65 78 74 20 73 74 61 74 65 6d 65 6e  T: Next statemen
55d0: 74 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  t after the firs
55e0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 76 6d  t */.  sqlite_vm
55f0: 20 2a 2a 70 70 56 6d 2c 20 20 20 20 20 20 20 20   **ppVm,        
5600: 20 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20 76     /* OUT: The v
5610: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
5620: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
5630: 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Msg             
5640: 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 65 72  /* OUT: Write er
5650: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
5660: 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
5670: 20 73 71 6c 69 74 65 4d 61 69 6e 28 64 62 2c 20   sqliteMain(db, 
5680: 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 70 7a 54 61  zSql, 0, 0, pzTa
5690: 69 6c 2c 20 70 70 56 6d 2c 20 70 7a 45 72 72 4d  il, ppVm, pzErrM
56a0: 73 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  sg);.}.../*.** T
56b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
56c0: 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20  tine destroys a 
56d0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
56e0: 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
56f0: 62 79 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  by.** the sqlite
5700: 5f 63 6f 6d 70 69 6c 65 28 29 20 72 6f 75 74 69  _compile() routi
5710: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
5720: 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 69  teger returned i
5730: 73 20 61 6e 20 53 51 4c 49 54 45 5f 20 73 75 63  s an SQLITE_ suc
5740: 63 65 73 73 2f 66 61 69 6c 75 72 65 20 63 6f 64  cess/failure cod
5750: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
5760: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f  .** the result o
5770: 66 20 65 78 65 63 75 74 69 6e 67 20 74 68 65 20  f executing the 
5780: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
5790: 20 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61    An error messa
57a0: 67 65 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  ge is.** written
57b0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
57c0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
57d0: 63 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 20  c and *pzErrMsg 
57e0: 69 73 20 6d 61 64 65 20 74 6f 0a 2a 2a 20 70 6f  is made to.** po
57f0: 69 6e 74 20 74 6f 20 74 68 61 74 20 65 72 72 6f  int to that erro
5800: 72 20 69 66 20 70 7a 45 72 72 4d 73 67 20 69 73  r if pzErrMsg is
5810: 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20 54 68 65 20   not NULL.  The 
5820: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
5830: 2a 2a 20 73 68 6f 75 6c 64 20 75 73 65 20 73 71  ** should use sq
5840: 6c 69 74 65 5f 66 72 65 65 6d 65 6d 28 29 20 74  lite_freemem() t
5850: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 65 73  o delete the mes
5860: 73 61 67 65 20 77 68 65 6e 20 69 74 20 68 61 73  sage when it has
5870: 20 66 69 6e 69 73 68 65 64 0a 2a 2a 20 77 69 74   finished.** wit
5880: 68 20 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  h it..*/.int sql
5890: 69 74 65 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20  ite_finalize(.  
58a0: 73 71 6c 69 74 65 5f 76 6d 20 2a 70 56 6d 2c 20  sqlite_vm *pVm, 
58b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
58c0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
58d0: 65 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65  e to be destroye
58e0: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  d */.  char **pz
58f0: 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
5900: 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65 20    /* OUT: Write 
5910: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
5920: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
5930: 72 63 20 3d 20 73 71 6c 69 74 65 56 64 62 65 46  rc = sqliteVdbeF
5940: 69 6e 61 6c 69 7a 65 28 28 56 64 62 65 2a 29 70  inalize((Vdbe*)p
5950: 56 6d 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  Vm, pzErrMsg);. 
5960: 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c 6c 6f   sqliteStrReallo
5970: 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  c(pzErrMsg);.  r
5980: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5990: 2a 2a 20 54 65 72 6d 69 6e 61 74 65 20 74 68 65  ** Terminate the
59a0: 20 63 75 72 72 65 6e 74 20 65 78 65 63 75 74 69   current executi
59b0: 6f 6e 20 6f 66 20 61 20 76 69 72 74 75 61 6c 20  on of a virtual 
59c0: 6d 61 63 68 69 6e 65 20 74 68 65 6e 0a 2a 2a 20  machine then.** 
59d0: 72 65 73 65 74 20 74 68 65 20 76 69 72 74 75 61  reset the virtua
59e0: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 20 74  l machine back t
59f0: 6f 20 69 74 73 20 73 74 61 72 74 69 6e 67 20 73  o its starting s
5a00: 74 61 74 65 20 73 6f 20 74 68 61 74 20 69 74 0a  tate so that it.
5a10: 2a 2a 20 63 61 6e 20 62 65 20 72 65 75 73 65 64  ** can be reused
5a20: 2e 20 20 41 6e 79 20 65 72 72 6f 72 20 6d 65 73  .  Any error mes
5a30: 73 61 67 65 20 72 65 73 75 6c 74 69 6e 67 20 66  sage resulting f
5a40: 72 6f 6d 20 74 68 65 20 70 72 69 6f 72 20 65 78  rom the prior ex
5a50: 65 63 75 74 69 6f 6e 0a 2a 2a 20 69 73 20 77 72  ecution.** is wr
5a60: 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 7a 45 72  itten into *pzEr
5a70: 72 4d 73 67 2e 20 20 41 20 73 75 63 63 65 73 73  rMsg.  A success
5a80: 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 70   code from the p
5a90: 72 69 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 2a  rior execution.*
5aa0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
5ab0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 72 65 73  /.int sqlite_res
5ac0: 65 74 28 0a 20 20 73 71 6c 69 74 65 5f 76 6d 20  et(.  sqlite_vm 
5ad0: 2a 70 56 6d 2c 20 20 20 20 20 20 20 20 20 20 20  *pVm,           
5ae0: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
5af0: 6d 61 63 68 69 6e 65 20 74 6f 20 62 65 20 64 65  machine to be de
5b00: 73 74 72 6f 79 65 64 20 2a 2f 0a 20 20 63 68 61  stroyed */.  cha
5b10: 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
5b20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
5b30: 57 72 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73  Write error mess
5b40: 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ages here */.){.
5b50: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
5b60: 65 56 64 62 65 52 65 73 65 74 28 28 56 64 62 65  eVdbeReset((Vdbe
5b70: 2a 29 70 56 6d 2c 20 70 7a 45 72 72 4d 73 67 29  *)pVm, pzErrMsg)
5b80: 3b 0a 20 20 73 71 6c 69 74 65 56 64 62 65 4d 61  ;.  sqliteVdbeMa
5b90: 6b 65 52 65 61 64 79 28 28 56 64 62 65 2a 29 70  keReady((Vdbe*)p
5ba0: 56 6d 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 29  Vm, -1, 0, 0, 0)
5bb0: 3b 0a 20 20 73 71 6c 69 74 65 53 74 72 52 65 61  ;.  sqliteStrRea
5bc0: 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a  lloc(pzErrMsg);.
5bd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5be0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
5bf0: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
5c00: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
5c10: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
5c20: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
5c30: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
5c40: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
5c50: 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 69  e_error_string(i
5c60: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
5c70: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
5c80: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73  h( rc ){.    cas
5c90: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
5ca0: 20 20 20 20 20 7a 20 3d 20 22 6e 6f 74 20 61 6e       z = "not an
5cb0: 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20 20   error";        
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5ce0: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
5cf0: 20 20 20 20 20 7a 20 3d 20 22 53 51 4c 20 6c 6f       z = "SQL lo
5d00: 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73  gic error or mis
5d10: 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 3b 20  sing database"; 
5d20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5d30: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
5d40: 4c 3a 20 20 20 7a 20 3d 20 22 69 6e 74 65 72 6e  L:   z = "intern
5d50: 61 6c 20 53 51 4c 69 74 65 20 69 6d 70 6c 65 6d  al SQLite implem
5d60: 65 6e 74 61 74 69 6f 6e 20 66 6c 61 77 22 3b 20  entation flaw"; 
5d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5d80: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
5d90: 20 20 20 20 20 7a 20 3d 20 22 61 63 63 65 73 73       z = "access
5da0: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
5db0: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
5dc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5dd0: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
5de0: 20 20 20 20 20 7a 20 3d 20 22 63 61 6c 6c 62 61       z = "callba
5df0: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
5e00: 72 79 20 61 62 6f 72 74 22 3b 20 20 20 20 20 20  ry abort";      
5e10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5e20: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
5e30: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
5e40: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b 20 20  se is locked";  
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5e70: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
5e80: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
5e90: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
5ea0: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
5eb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5ec0: 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20  e SQLITE_NOMEM: 
5ed0: 20 20 20 20 20 7a 20 3d 20 22 6f 75 74 20 6f 66       z = "out of
5ee0: 20 6d 65 6d 6f 72 79 22 3b 20 20 20 20 20 20 20   memory";       
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5f10: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
5f20: 59 3a 20 20 20 7a 20 3d 20 22 61 74 74 65 6d 70  Y:   z = "attemp
5f30: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
5f40: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 3b  donly database";
5f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5f60: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
5f70: 50 54 3a 20 20 7a 20 3d 20 22 69 6e 74 65 72 72  PT:  z = "interr
5f80: 75 70 74 65 64 22 3b 20 20 20 20 20 20 20 20 20  upted";         
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5fb0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20  e SQLITE_IOERR: 
5fc0: 20 20 20 20 20 7a 20 3d 20 22 64 69 73 6b 20 49       z = "disk I
5fd0: 2f 4f 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20  /O error";      
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6000: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
6010: 3a 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61  :    z = "databa
6020: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
6030: 20 6d 61 6c 66 6f 72 6d 65 64 22 3b 20 20 20 20   malformed";    
6040: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6050: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  e SQLITE_NOTFOUN
6060: 44 3a 20 20 20 7a 20 3d 20 22 74 61 62 6c 65 20  D:   z = "table 
6070: 6f 72 20 72 65 63 6f 72 64 20 6e 6f 74 20 66 6f  or record not fo
6080: 75 6e 64 22 3b 20 20 20 20 20 20 20 20 20 20 20  und";           
6090: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
60a0: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
60b0: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
60c0: 73 65 20 69 73 20 66 75 6c 6c 22 3b 20 20 20 20  se is full";    
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
60f0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
6100: 4e 3a 20 20 20 7a 20 3d 20 22 75 6e 61 62 6c 65  N:   z = "unable
6110: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
6120: 65 20 66 69 6c 65 22 3b 20 20 20 20 20 20 20 20  e file";        
6130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6140: 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  e SQLITE_PROTOCO
6150: 4c 3a 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61  L:   z = "databa
6160: 73 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  se locking proto
6170: 63 6f 6c 20 66 61 69 6c 75 72 65 22 3b 20 20 20  col failure";   
6180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6190: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
61a0: 20 20 20 20 20 7a 20 3d 20 22 74 61 62 6c 65 20       z = "table 
61b0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
61c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
61d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
61e0: 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a  e SQLITE_SCHEMA:
61f0: 20 20 20 20 20 7a 20 3d 20 22 64 61 74 61 62 61       z = "databa
6200: 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
6210: 61 6e 67 65 64 22 3b 20 20 20 20 20 20 20 20 20  anged";         
6220: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6230: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
6240: 20 20 20 20 20 7a 20 3d 20 22 74 6f 6f 20 6d 75       z = "too mu
6250: 63 68 20 64 61 74 61 20 66 6f 72 20 6f 6e 65 20  ch data for one 
6260: 74 61 62 6c 65 20 72 6f 77 22 3b 20 20 20 20 20  table row";     
6270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6280: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
6290: 49 4e 54 3a 20 7a 20 3d 20 22 63 6f 6e 73 74 72  INT: z = "constr
62a0: 61 69 6e 74 20 66 61 69 6c 65 64 22 3b 20 20 20  aint failed";   
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
62d0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
62e0: 48 3a 20 20 20 7a 20 3d 20 22 64 61 74 61 74 79  H:   z = "dataty
62f0: 70 65 20 6d 69 73 6d 61 74 63 68 22 3b 20 20 20  pe mismatch";   
6300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6320: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a  e SQLITE_MISUSE:
6330: 20 20 20 20 20 7a 20 3d 20 22 6c 69 62 72 61 72       z = "librar
6340: 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64  y routine called
6350: 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65   out of sequence
6360: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ";break;.    cas
6370: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
6380: 20 20 20 20 20 7a 20 3d 20 22 6b 65 72 6e 65 6c       z = "kernel
6390: 20 6c 61 63 6b 73 20 6c 61 72 67 65 20 66 69 6c   lacks large fil
63a0: 65 20 73 75 70 70 6f 72 74 22 3b 20 20 20 20 20  e support";     
63b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
63c0: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
63d0: 20 20 20 20 20 7a 20 3d 20 22 61 75 74 68 6f 72       z = "author
63e0: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 3b  ization denied";
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6410: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
6420: 20 20 20 20 20 7a 20 3d 20 22 61 75 78 69 6c 69       z = "auxili
6430: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72  ary database for
6440: 6d 61 74 20 65 72 72 6f 72 22 3b 20 20 20 20 20  mat error";     
6450: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
6460: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
6470: 20 20 20 20 20 7a 20 3d 20 22 62 69 6e 64 20 69       z = "bind i
6480: 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndex out of rang
6490: 65 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  e";             
64a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
64b0: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
64c0: 20 20 20 20 20 7a 20 3d 20 22 75 6e 6b 6e 6f 77       z = "unknow
64d0: 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20 20 20  n error";       
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
6500: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
6510: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6520: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79  mplements a busy
6530: 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73   callback that s
6540: 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a  leeps and tries.
6550: 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61  ** again until a
6560: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
6570: 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20  s reached.  The 
6580: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
6590: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e  .** an integer n
65a0: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
65b0: 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20  conds passed in 
65c0: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
65d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
65e0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65  tic int sqliteDe
65f0: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
6600: 6b 28 0a 20 76 6f 69 64 20 2a 54 69 6d 65 6f 75  k(. void *Timeou
6610: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
6620: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
6630: 66 20 74 69 6d 65 20 74 6f 20 77 61 69 74 20 2a  f time to wait *
6640: 2f 0a 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 4e  /. const char *N
6650: 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 54  otUsed,     /* T
6660: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
6670: 61 62 6c 65 20 74 68 61 74 20 69 73 20 62 75 73  able that is bus
6680: 79 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20  y */. int count 
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
66b0: 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e  s table has been
66c0: 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20   busy */.){.#if 
66d0: 53 51 4c 49 54 45 5f 4d 49 4e 5f 53 4c 45 45 50  SQLITE_MIN_SLEEP
66e0: 5f 4d 53 3d 3d 31 0a 20 20 73 74 61 74 69 63 20  _MS==1.  static 
66f0: 63 6f 6e 73 74 20 63 68 61 72 20 64 65 6c 61 79  const char delay
6700: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20  s[] =.     { 1, 
6710: 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30  2, 5, 10, 15, 20
6720: 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20  , 25, 25,  25,  
6730: 35 30 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30  50,  50,  50, 10
6740: 30 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0};.  static con
6750: 73 74 20 73 68 6f 72 74 20 69 6e 74 20 74 6f 74  st short int tot
6760: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
6770: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
6780: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
6790: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 2c 20   128, 178, 228, 
67a0: 32 38 37 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  287};.# define N
67b0: 44 45 4c 41 59 20 28 73 69 7a 65 6f 66 28 64 65  DELAY (sizeof(de
67c0: 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28 64 65 6c  lays)/sizeof(del
67d0: 61 79 73 5b 30 5d 29 29 0a 20 20 69 6e 74 20 74  ays[0])).  int t
67e0: 69 6d 65 6f 75 74 20 3d 20 28 69 6e 74 29 54 69  imeout = (int)Ti
67f0: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
6800: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 69 66  ay, prior;..  if
6810: 28 20 63 6f 75 6e 74 20 3c 3d 20 4e 44 45 4c 41  ( count <= NDELA
6820: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
6830: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 2d 31 5d   delays[count-1]
6840: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
6850: 74 61 6c 73 5b 63 6f 75 6e 74 2d 31 5d 3b 0a 20  tals[count-1];. 
6860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61   }else{.    dela
6870: 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41  y = delays[NDELA
6880: 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  Y-1];.    prior 
6890: 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d  = totals[NDELAY-
68a0: 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e  1] + delay*(coun
68b0: 74 2d 4e 44 45 4c 41 59 2d 31 29 3b 0a 20 20 7d  t-NDELAY-1);.  }
68c0: 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64  .  if( prior + d
68d0: 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29  elay > timeout )
68e0: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69  {.    delay = ti
68f0: 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20  meout - prior;. 
6900: 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20     if( delay<=0 
6910: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
6920: 20 20 73 71 6c 69 74 65 4f 73 53 6c 65 65 70 28    sqliteOsSleep(
6930: 64 65 6c 61 79 29 3b 0a 20 20 72 65 74 75 72 6e  delay);.  return
6940: 20 31 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20   1;.#else.  int 
6950: 74 69 6d 65 6f 75 74 20 3d 20 28 69 6e 74 29 54  timeout = (int)T
6960: 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63  imeout;.  if( (c
6970: 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74  ount+1)*1000 > t
6980: 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65  imeout ){.    re
6990: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
69a0: 6c 69 74 65 4f 73 53 6c 65 65 70 28 31 30 30 30  liteOsSleep(1000
69b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
69c0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
69d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
69e0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
69f0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
6a00: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
6a10: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
6a20: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
6a30: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
6a40: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
6a50: 69 74 65 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  ite_busy_handler
6a60: 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a  (.  sqlite *db,.
6a70: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76    int (*xBusy)(v
6a80: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
6a90: 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
6aa0: 41 72 67 0a 29 7b 0a 20 20 64 62 2d 3e 78 42 75  Arg.){.  db->xBu
6ab0: 73 79 43 61 6c 6c 62 61 63 6b 20 3d 20 78 42 75  syCallback = xBu
6ac0: 73 79 3b 0a 20 20 64 62 2d 3e 70 42 75 73 79 41  sy;.  db->pBusyA
6ad0: 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 0a 23 69  rg = pArg;.}..#i
6ae0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6af0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
6b00: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
6b10: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
6b20: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
6b30: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
6b40: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
6b50: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
6b60: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
6b70: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
6b80: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
6b90: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
6ba0: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
6bb0: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
6bc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f  .*/.void sqlite_
6bd0: 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72  progress_handler
6be0: 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20  (.  sqlite *db, 
6bf0: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
6c00: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
6c10: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
6c20: 2a 70 41 72 67 0a 29 7b 0a 20 20 69 66 28 20 6e  *pArg.){.  if( n
6c30: 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d  Ops>0 ){.    db-
6c40: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72  >xProgress = xPr
6c50: 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e  ogress;.    db->
6c60: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e  nProgressOps = n
6c70: 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  Ops;.    db->pPr
6c80: 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67  ogressArg = pArg
6c90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
6ca0: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30  b->xProgress = 0
6cb0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
6cc0: 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20  essOps = 0;.    
6cd0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
6ce0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
6cf0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
6d00: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
6d10: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
6d20: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
6d30: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
6d40: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
6d50: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
6d60: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
6d70: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
6d80: 65 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  e_busy_timeout(s
6d90: 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 6d  qlite *db, int m
6da0: 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29  s){.  if( ms>0 )
6db0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 62 75 73  {.    sqlite_bus
6dc0: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
6dd0: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
6de0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
6df0: 6d 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ms);.  }else{.  
6e00: 20 20 73 71 6c 69 74 65 5f 62 75 73 79 5f 68 61    sqlite_busy_ha
6e10: 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b  ndler(db, 0, 0);
6e20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  .  }.}../*.** Ca
6e30: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
6e40: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
6e50: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
6e60: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
6e70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 69 6e  /.void sqlite_in
6e80: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 20 2a  terrupt(sqlite *
6e90: 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  db){.  db->flags
6ea0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
6eb0: 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rupt;.}../*.** W
6ec0: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73  indows systems s
6ed0: 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20  hould call this 
6ee0: 72 6f 75 74 69 6e 65 20 74 6f 20 66 72 65 65 20  routine to free 
6ef0: 6d 65 6d 6f 72 79 20 74 68 61 74 0a 2a 2a 20 69  memory that.** i
6f00: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  s returned in th
6f10: 65 20 69 6e 20 74 68 65 20 65 72 72 6d 73 67 20  e in the errmsg 
6f20: 70 61 72 61 6d 65 74 65 72 20 6f 66 20 73 71 6c  parameter of sql
6f30: 69 74 65 5f 6f 70 65 6e 28 29 20 77 68 65 6e 0a  ite_open() when.
6f40: 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 61 20 44  ** SQLite is a D
6f50: 4c 4c 2e 20 20 46 6f 72 20 73 6f 6d 65 20 72 65  LL.  For some re
6f60: 61 73 6f 6e 2c 20 69 74 20 64 6f 65 73 20 6e 6f  ason, it does no
6f70: 74 20 77 6f 72 6b 20 74 6f 20 63 61 6c 6c 20 66  t work to call f
6f80: 72 65 65 28 29 0a 2a 2a 20 64 69 72 65 63 74 6c  ree().** directl
6f90: 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  y..**.** Note th
6fa0: 61 74 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61  at we need to ca
6fb0: 6c 6c 20 66 72 65 65 28 29 20 6e 6f 74 20 73 71  ll free() not sq
6fc0: 6c 69 74 65 46 72 65 65 28 29 20 68 65 72 65 2c  liteFree() here,
6fd0: 20 73 69 6e 63 65 20 65 76 65 72 79 0a 2a 2a 20   since every.** 
6fe0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 65  string that is e
6ff0: 78 70 6f 72 74 65 64 20 66 72 6f 6d 20 53 51 4c  xported from SQL
7000: 69 74 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ite should have 
7010: 61 6c 72 65 61 64 79 20 70 61 73 73 65 64 20 74  already passed t
7020: 68 72 6f 75 67 68 0a 2a 2a 20 73 71 6c 69 74 65  hrough.** sqlite
7030: 53 74 72 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  StrRealloc()..*/
7040: 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 66 72 65  .void sqlite_fre
7050: 65 6d 65 6d 28 76 6f 69 64 20 2a 70 29 7b 20 66  emem(void *p){ f
7060: 72 65 65 28 70 29 3b 20 7d 0a 0a 2f 2a 0a 2a 2a  ree(p); }../*.**
7070: 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
7080: 20 6e 65 65 64 20 66 75 6e 63 74 69 6f 6e 73 20   need functions 
7090: 74 6f 20 63 61 6c 6c 20 74 6f 20 72 65 74 75 72  to call to retur
70a0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 76 65 72  n the sqlite_ver
70b0: 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  sion.** and sqli
70c0: 74 65 5f 65 6e 63 6f 64 69 6e 67 20 73 74 72 69  te_encoding stri
70d0: 6e 67 73 20 73 69 6e 63 65 20 74 68 65 79 20 61  ngs since they a
70e0: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 63 63  re unable to acc
70f0: 65 73 73 20 63 6f 6e 73 74 61 6e 74 73 0a 2a 2a  ess constants.**
7100: 20 77 69 74 68 69 6e 20 44 4c 4c 73 2e 0a 2a 2f   within DLLs..*/
7110: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
7120: 69 74 65 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76  ite_libversion(v
7130: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c  oid){ return sql
7140: 69 74 65 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 63  ite_version; }.c
7150: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
7160: 65 5f 6c 69 62 65 6e 63 6f 64 69 6e 67 28 76 6f  e_libencoding(vo
7170: 69 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  id){ return sqli
7180: 74 65 5f 65 6e 63 6f 64 69 6e 67 3b 20 7d 0a 0a  te_encoding; }..
7190: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77  /*.** Create new
71a0: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
71b0: 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71  nctions.  The sq
71c0: 6c 69 74 65 5f 63 72 65 61 74 65 5f 66 75 6e 63  lite_create_func
71d0: 74 69 6f 6e 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  tion().** routin
71e0: 65 20 63 72 65 61 74 65 73 20 61 20 72 65 67 75  e creates a regu
71f0: 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  lar function and
7200: 20 73 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 61   sqlite_create_a
7210: 67 67 72 65 67 61 74 65 28 29 0a 2a 2a 20 63 72  ggregate().** cr
7220: 65 61 74 65 73 20 61 6e 20 61 67 67 72 65 67 61  eates an aggrega
7230: 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  te function..**.
7240: 2a 2a 20 50 61 73 73 69 6e 67 20 61 20 4e 55 4c  ** Passing a NUL
7250: 4c 20 78 46 75 6e 63 20 61 72 67 75 6d 65 6e 74  L xFunc argument
7260: 20 6f 72 20 4e 55 4c 4c 20 78 53 74 65 70 20 61   or NULL xStep a
7270: 6e 64 20 78 46 69 6e 61 6c 69 7a 65 20 61 72 67  nd xFinalize arg
7280: 75 6d 65 6e 74 73 0a 2a 2a 20 64 69 73 61 62 6c  uments.** disabl
7290: 65 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  es the function.
72a0: 20 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65    Calling sqlite
72b0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
72c0: 28 29 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  () with the.** s
72d0: 61 6d 65 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d  ame name and num
72e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
72f0: 20 61 73 20 61 20 70 72 69 6f 72 20 63 61 6c 6c   as a prior call
7300: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 5f 63 72   to.** sqlite_cr
7310: 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 28 29  eate_aggregate()
7320: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 70 72   disables the pr
7330: 69 6f 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73  ior call to.** s
7340: 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 61 67 67  qlite_create_agg
7350: 72 65 67 61 74 65 28 29 2c 20 61 6e 64 20 76 69  regate(), and vi
7360: 63 65 20 76 65 72 73 61 2e 0a 2a 2a 0a 2a 2a 20  ce versa..**.** 
7370: 49 66 20 6e 41 72 67 20 69 73 20 2d 31 20 69 74  If nArg is -1 it
7380: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
7390: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61   function will a
73a0: 63 63 65 70 74 20 61 6e 79 20 6e 75 6d 62 65 72  ccept any number
73b0: 0a 2a 2a 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  .** of arguments
73c0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e 0a 2a  , including 0..*
73d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 63 72 65  /.int sqlite_cre
73e0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
73f0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20  sqlite *db,     
7400: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
7410: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 69 73  function to this
7420: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7430: 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
7440: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 2f  char *zName,   /
7450: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  * Name of the fu
7460: 6e 63 74 69 6f 6e 20 74 6f 20 61 64 64 20 2a 2f  nction to add */
7470: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
7480: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7490: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
74a0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  /.  void (*xFunc
74b0: 29 28 73 71 6c 69 74 65 5f 66 75 6e 63 2a 2c 69  )(sqlite_func*,i
74c0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  nt,const char**)
74d0: 2c 20 20 2f 2a 20 54 68 65 20 69 6d 70 6c 65 6d  ,  /* The implem
74e0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  entation */.  vo
74f0: 69 64 20 2a 70 55 73 65 72 44 61 74 61 20 20 20  id *pUserData   
7500: 20 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20     /* User data 
7510: 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  */.){.  FuncDef 
7520: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
7530: 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c 20  .  if( db==0 || 
7540: 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  zName==0 || sqli
7550: 74 65 53 61 66 65 74 79 43 68 65 63 6b 28 64 62  teSafetyCheck(db
7560: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
7570: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
7580: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 4e 61  Name);.  if( nNa
7590: 6d 65 3e 32 35 35 20 29 20 72 65 74 75 72 6e 20  me>255 ) return 
75a0: 31 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 46  1;.  p = sqliteF
75b0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
75c0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  zName, nName, nA
75d0: 72 67 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 3d  rg, 1);.  if( p=
75e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
75f0: 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e   p->xFunc = xFun
7600: 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20  c;.  p->xStep = 
7610: 30 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  0;.  p->xFinaliz
7620: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 55 73 65  e = 0;.  p->pUse
7630: 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74  rData = pUserDat
7640: 61 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  a;.  return 0;.}
7650: 0a 69 6e 74 20 73 71 6c 69 74 65 5f 63 72 65 61  .int sqlite_crea
7660: 74 65 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20  te_aggregate(.  
7670: 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20  sqlite *db,     
7680: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
7690: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 69 73  function to this
76a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
76b0: 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
76c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 2f  char *zName,   /
76d0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  * Name of the fu
76e0: 6e 63 74 69 6f 6e 20 74 6f 20 61 64 64 20 2a 2f  nction to add */
76f0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
7700: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7710: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
7720: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  /.  void (*xStep
7730: 29 28 73 71 6c 69 74 65 5f 66 75 6e 63 2a 2c 69  )(sqlite_func*,i
7740: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  nt,const char**)
7750: 2c 20 2f 2a 20 54 68 65 20 73 74 65 70 20 66 75  , /* The step fu
7760: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
7770: 20 28 2a 78 46 69 6e 61 6c 69 7a 65 29 28 73 71   (*xFinalize)(sq
7780: 6c 69 74 65 5f 66 75 6e 63 2a 29 2c 20 20 20 20  lite_func*),    
7790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
77a0: 20 66 69 6e 61 6c 69 7a 65 72 20 2a 2f 0a 20 20   finalizer */.  
77b0: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 20  void *pUserData 
77c0: 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61 74       /* User dat
77d0: 61 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65  a */.){.  FuncDe
77e0: 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  f *p;.  int nNam
77f0: 65 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 7c  e;.  if( db==0 |
7800: 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71  | zName==0 || sq
7810: 6c 69 74 65 53 61 66 65 74 79 43 68 65 63 6b 28  liteSafetyCheck(
7820: 64 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  db) ) return 1;.
7830: 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e    nName = strlen
7840: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  (zName);.  if( n
7850: 4e 61 6d 65 3e 32 35 35 20 29 20 72 65 74 75 72  Name>255 ) retur
7860: 6e 20 31 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  n 1;.  p = sqlit
7870: 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  eFindFunction(db
7880: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
7890: 6e 41 72 67 2c 20 31 29 3b 0a 20 20 69 66 28 20  nArg, 1);.  if( 
78a0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  p==0 ) return 1;
78b0: 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 30 3b  .  p->xFunc = 0;
78c0: 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53  .  p->xStep = xS
78d0: 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c  tep;.  p->xFinal
78e0: 69 7a 65 20 3d 20 78 46 69 6e 61 6c 69 7a 65 3b  ize = xFinalize;
78f0: 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20  .  p->pUserData 
7900: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 72  = pUserData;.  r
7910: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
7920: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 61 74  * Change the dat
7930: 61 74 79 70 65 20 66 6f 72 20 61 6c 6c 20 66 75  atype for all fu
7940: 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 67  nctions with a g
7950: 69 76 65 6e 20 6e 61 6d 65 2e 20 20 53 65 65 20  iven name.  See 
7960: 74 68 65 0a 2a 2a 20 68 65 61 64 65 72 20 63 6f  the.** header co
7970: 6d 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 70 72  mment for the pr
7980: 6f 74 6f 74 79 70 65 20 6f 66 20 74 68 69 73 20  ototype of this 
7990: 66 75 6e 63 74 69 6f 6e 20 69 6e 20 73 71 6c 69  function in sqli
79a0: 74 65 2e 68 20 66 6f 72 0a 2a 2a 20 61 64 64 69  te.h for.** addi
79b0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
79c0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
79d0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 74 79 70 65 28  e_function_type(
79e0: 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73  sqlite *db, cons
79f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
7a00: 6e 74 20 64 61 74 61 54 79 70 65 29 7b 0a 20 20  nt dataType){.  
7a10: 46 75 6e 63 44 65 66 20 2a 70 20 3d 20 28 46 75  FuncDef *p = (Fu
7a20: 6e 63 44 65 66 2a 29 73 71 6c 69 74 65 48 61 73  ncDef*)sqliteHas
7a30: 68 46 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63  hFind(&db->aFunc
7a40: 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  , zName, strlen(
7a50: 7a 4e 61 6d 65 29 29 3b 0a 20 20 77 68 69 6c 65  zName));.  while
7a60: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 64 61  ( p ){.    p->da
7a70: 74 61 54 79 70 65 20 3d 20 64 61 74 61 54 79 70  taType = dataTyp
7a80: 65 3b 20 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e; .    p = p->p
7a90: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
7aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7ab0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
7ac0: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
7ad0: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
7ae0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
7af0: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
7b00: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
7b10: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
7b20: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
7b30: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
7b40: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
7b50: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
7b60: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
7b70: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
7b80: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
7b90: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
7ba0: 66 20 65 61 63 68 0a 2a 2a 20 73 71 6c 69 74 65  f each.** sqlite
7bb0: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _exec()..*/.void
7bc0: 20 2a 73 71 6c 69 74 65 5f 74 72 61 63 65 28 73   *sqlite_trace(s
7bd0: 71 6c 69 74 65 20 2a 64 62 2c 20 76 6f 69 64 20  qlite *db, void 
7be0: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
7bf0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
7c00: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
7c10: 64 20 2a 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54  d *pOld = db->pT
7c20: 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  raceArg;.  db->x
7c30: 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a  Trace = xTrace;.
7c40: 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20    db->pTraceArg 
7c50: 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  = pArg;.  return
7c60: 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 2a 2a 20 45   pOld;.}../*** E
7c70: 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a  XPERIMENTAL ***.
7c80: 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  **.** Register a
7c90: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
7ca0: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
7cb0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65  ransaction comme
7cc0: 6e 74 73 2e 0a 2a 2a 20 49 66 20 65 69 74 68 65  nts..** If eithe
7cd0: 72 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  r function retur
7ce0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
7cf0: 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63  n the commit bec
7d00: 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61  omes a.** rollba
7d10: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ck..*/.void *sql
7d20: 69 74 65 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  ite_commit_hook(
7d30: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20  .  sqlite *db,  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d50: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
7d60: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
7d70: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
7d80: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
7d90: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
7da0: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
7db0: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
7dc0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
7dd0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
7de0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
7df0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
7e00: 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
7e10: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
7e20: 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
7e30: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
7e40: 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
7e50: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
7e60: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
7e70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7e80: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 6e   to create a con
7e90: 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
7ea0: 61 62 61 73 65 20 42 54 72 65 65 0a 2a 2a 20 64  abase BTree.** d
7eb0: 72 69 76 65 72 2e 20 20 49 66 20 7a 46 69 6c 65  river.  If zFile
7ec0: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
7ed0: 20 6f 66 20 61 20 66 69 6c 65 2c 20 74 68 65 6e   of a file, then
7ee0: 20 74 68 61 74 20 66 69 6c 65 20 69 73 0a 2a 2a   that file is.**
7ef0: 20 6f 70 65 6e 65 64 20 61 6e 64 20 75 73 65 64   opened and used
7f00: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
7f10: 69 73 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  is the magic nam
7f20: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  e ":memory:" the
7f30: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
7f40: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  e is stored in m
7f50: 65 6d 6f 72 79 20 28 61 6e 64 20 69 73 20 74 68  emory (and is th
7f60: 75 73 20 66 6f 72 67 6f 74 74 65 6e 20 61 73 20  us forgotten as 
7f70: 73 6f 6f 6e 20 61 73 0a 2a 2a 20 74 68 65 20 63  soon as.** the c
7f80: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f  onnection is clo
7f90: 73 65 64 2e 29 20 20 49 66 20 7a 46 69 6c 65 6e  sed.)  If zFilen
7fa0: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
7fb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
7fc0: 20 69 73 20 66 6f 72 20 74 65 6d 70 6f 72 61 72   is for temporar
7fd0: 79 20 75 73 65 20 6f 6e 6c 79 20 61 6e 64 20 69  y use only and i
7fe0: 73 20 64 65 6c 65 74 65 64 20 61 73 20 73 6f 6f  s deleted as soo
7ff0: 6e 20 61 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  n as the connect
8000: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6c 6f 73 65 64  ion.** is closed
8010: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 65 6d 70 6f 72  ..**.** A tempor
8020: 61 72 79 20 64 61 74 61 62 61 73 65 20 63 61 6e  ary database can
8030: 20 62 65 20 65 69 74 68 65 72 20 61 20 64 69 73   be either a dis
8040: 6b 20 66 69 6c 65 20 28 74 68 61 74 20 69 73 20  k file (that is 
8050: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a  automatically.**
8060: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
8070: 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  e file is closed
8080: 29 20 6f 72 20 61 20 73 65 74 20 6f 66 20 72 65  ) or a set of re
8090: 64 2d 62 6c 61 63 6b 20 74 72 65 65 73 20 68 65  d-black trees he
80a0: 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2c 0a 2a 2a  ld in memory,.**
80b0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
80c0: 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  e values of the 
80d0: 54 45 4d 50 5f 53 54 4f 52 45 20 63 6f 6d 70 69  TEMP_STORE compi
80e0: 6c 65 2d 74 69 6d 65 20 6d 61 63 72 6f 20 61 6e  le-time macro an
80f0: 64 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 74 65 6d  d the.** db->tem
8100: 70 5f 73 74 6f 72 65 20 76 61 72 69 61 62 6c 65  p_store variable
8110: 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
8120: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
8130: 72 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rt:.**.**       
8140: 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64  TEMP_STORE     d
8150: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20  b->temp_store   
8160: 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65    Location of te
8170: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
8180: 0a 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d  .**       ------
8190: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
81a0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
81b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
81d0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
81e0: 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
81f0: 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20          file.** 
8200: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
8210: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
8220: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a            file.*
8230: 2a 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20  *           1   
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
8250: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
8260: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ry.**           
8270: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
8280: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
8290: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
82a0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
82b0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
82c0: 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20    file.**       
82d0: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
82e0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
82f0: 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20      memory.**   
8300: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
8310: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
8320: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a          memory.*
8330: 2a 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20  *           3   
8340: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
8350: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
8360: 72 79 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ry.*/.int sqlite
8370: 42 74 72 65 65 46 61 63 74 6f 72 79 28 0a 20 20  BtreeFactory(.  
8380: 63 6f 6e 73 74 20 73 71 6c 69 74 65 20 2a 64 62  const sqlite *db
8390: 2c 09 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61  ,.    /* Main da
83a0: 74 61 62 61 73 65 20 77 68 65 6e 20 6f 70 65 6e  tabase when open
83b0: 69 6e 67 20 61 75 78 20 6f 74 68 65 72 77 69 73  ing aux otherwis
83c0: 65 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  e 0 */.  const c
83d0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
83e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
83f0: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
8400: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
8410: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  base */.  int om
8420: 69 74 4a 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20  itJournal,      
8430: 20 20 20 20 2f 2a 20 69 66 20 54 52 55 45 20 74      /* if TRUE t
8440: 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 6f 75 72 6e  hen do not journ
8450: 61 6c 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  al this file */.
8460: 20 20 69 6e 74 20 6e 43 61 63 68 65 2c 20 20 20    int nCache,   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
8480: 6f 77 20 6d 61 6e 79 20 70 61 67 65 73 20 69 6e  ow many pages in
8490: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
84a0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
84b0: 74 72 65 65 29 7b 20 20 20 20 20 20 20 20 20 2f  tree){         /
84c0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
84d0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
84e0: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 0a 20  itten here */.. 
84f0: 20 61 73 73 65 72 74 28 20 70 70 42 74 72 65 65   assert( ppBtree
8500: 20 21 3d 20 30 29 3b 0a 0a 23 69 66 6e 64 65 66   != 0);..#ifndef
8510: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 4d   SQLITE_OMIT_INM
8520: 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 7a 46  EMORYDB.  if( zF
8530: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
8540: 20 20 69 66 20 28 54 45 4d 50 5f 53 54 4f 52 45    if (TEMP_STORE
8550: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 2f   == 0) {.      /
8560: 2a 20 41 6c 77 61 79 73 20 75 73 65 20 66 69 6c  * Always use fil
8570: 65 20 62 61 73 65 64 20 74 65 6d 70 6f 72 61 72  e based temporar
8580: 79 20 44 42 20 2a 2f 0a 20 20 20 20 20 20 72 65  y DB */.      re
8590: 74 75 72 6e 20 73 71 6c 69 74 65 42 74 72 65 65  turn sqliteBtree
85a0: 4f 70 65 6e 28 30 2c 20 6f 6d 69 74 4a 6f 75 72  Open(0, omitJour
85b0: 6e 61 6c 2c 20 6e 43 61 63 68 65 2c 20 70 70 42  nal, nCache, ppB
85c0: 74 72 65 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73  tree);.    } els
85d0: 65 20 69 66 20 28 54 45 4d 50 5f 53 54 4f 52 45  e if (TEMP_STORE
85e0: 20 3d 3d 20 31 20 7c 7c 20 54 45 4d 50 5f 53 54   == 1 || TEMP_ST
85f0: 4f 52 45 20 3d 3d 20 32 29 20 7b 0a 20 20 20 20  ORE == 2) {.    
8600: 20 20 2f 2a 20 53 77 69 74 63 68 20 64 65 70 65    /* Switch depe
8610: 6e 64 69 6e 67 20 6f 6e 20 63 6f 6d 70 69 6c 65  nding on compile
8620: 2d 74 69 6d 65 20 61 6e 64 2f 6f 72 20 72 75 6e  -time and/or run
8630: 74 69 6d 65 20 73 65 74 74 69 6e 67 73 2e 20 2a  time settings. *
8640: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 6f 63 61  /.      int loca
8650: 74 69 6f 6e 20 3d 20 64 62 2d 3e 74 65 6d 70 5f  tion = db->temp_
8660: 73 74 6f 72 65 3d 3d 30 20 3f 20 54 45 4d 50 5f  store==0 ? TEMP_
8670: 53 54 4f 52 45 20 3a 20 64 62 2d 3e 74 65 6d 70  STORE : db->temp
8680: 5f 73 74 6f 72 65 3b 0a 0a 20 20 20 20 20 20 69  _store;..      i
8690: 66 20 28 6c 6f 63 61 74 69 6f 6e 20 3d 3d 20 31  f (location == 1
86a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
86b0: 72 6e 20 73 71 6c 69 74 65 42 74 72 65 65 4f 70  rn sqliteBtreeOp
86c0: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 6d  en(zFilename, om
86d0: 69 74 4a 6f 75 72 6e 61 6c 2c 20 6e 43 61 63 68  itJournal, nCach
86e0: 65 2c 20 70 70 42 74 72 65 65 29 3b 0a 20 20 20  e, ppBtree);.   
86f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
8700: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
8710: 65 52 62 74 72 65 65 4f 70 65 6e 28 30 2c 20 30  eRbtreeOpen(0, 0
8720: 2c 20 30 2c 20 70 70 42 74 72 65 65 29 3b 0a 20  , 0, ppBtree);. 
8730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
8740: 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77  e {.      /* Alw
8750: 61 79 73 20 75 73 65 20 69 6e 2d 63 6f 72 65 20  ays use in-core 
8760: 44 42 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  DB */.      retu
8770: 72 6e 20 73 71 6c 69 74 65 52 62 74 72 65 65 4f  rn sqliteRbtreeO
8780: 70 65 6e 28 30 2c 20 30 2c 20 30 2c 20 70 70 42  pen(0, 0, 0, ppB
8790: 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tree);.    }.  }
87a0: 65 6c 73 65 20 69 66 28 20 7a 46 69 6c 65 6e 61  else if( zFilena
87b0: 6d 65 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 73 74  me[0]==':' && st
87c0: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
87d0: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
87e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
87f0: 74 65 52 62 74 72 65 65 4f 70 65 6e 28 30 2c 20  teRbtreeOpen(0, 
8800: 30 2c 20 30 2c 20 70 70 42 74 72 65 65 29 3b 0a  0, 0, ppBtree);.
8810: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
8820: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71   {.    return sq
8830: 6c 69 74 65 42 74 72 65 65 4f 70 65 6e 28 7a 46  liteBtreeOpen(zF
8840: 69 6c 65 6e 61 6d 65 2c 20 6f 6d 69 74 4a 6f 75  ilename, omitJou
8850: 72 6e 61 6c 2c 20 6e 43 61 63 68 65 2c 20 70 70  rnal, nCache, pp
8860: 42 74 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a        Btree);.  }.}.