/ Hex Artifact Content
Login

Artifact e38bf6463dd628d7f9b590b2a81293624f9482e9:


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 35 32 20 32 30 30 34 2f 30 32  ,v 1.152 2004/02
0280: 2f 31 34 20 31 36 3a 33 31 3a 30 33 20 64 72 68  /14 16:31:03 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 69 66 28 20 2a 70 44 61 74 61 2d 3e 70 7a    if( *pData->pz
14c0: 45 72 72 4d 73 67 20 29 20 73 71 6c 69 74 65 5f  ErrMsg ) sqlite_
14d0: 66 72 65 65 6d 65 6d 28 2a 70 44 61 74 61 2d 3e  freemem(*pData->
14e0: 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a  pzErrMsg);.    *
14f0: 70 44 61 74 61 2d 3e 70 7a 45 72 72 4d 73 67 20  pData->pzErrMsg 
1500: 3d 20 7a 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  = zErr;.  }..  /
1510: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1520: 63 75 72 72 65 64 20 69 6e 20 74 68 65 20 53 51  curred in the SQ
1530: 4c 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68  L above, then th
1540: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e transaction wi
1550: 6c 6c 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  ll.  ** rollback
1560: 20 77 68 69 63 68 20 77 69 6c 6c 20 64 65 6c 65   which will dele
1570: 74 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  te the internal 
1580: 73 79 6d 62 6f 6c 20 74 61 62 6c 65 73 2e 20 20  symbol tables.  
1590: 54 68 69 73 20 77 69 6c 6c 0a 20 20 2a 2a 20 63  This will.  ** c
15a0: 61 75 73 65 20 74 68 65 20 73 74 72 75 63 74 75  ause the structu
15b0: 72 65 20 74 68 61 74 20 70 54 61 62 20 70 6f 69  re that pTab poi
15c0: 6e 74 73 20 74 6f 20 62 65 20 64 65 6c 65 74 65  nts to be delete
15d0: 64 2e 20 20 49 6e 20 63 61 73 65 20 74 68 61 74  d.  In case that
15e0: 0a 20 20 2a 2a 20 68 61 70 70 65 6e 65 64 2c 20  .  ** happened, 
15f0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 66 65 74  we need to refet
1600: 63 68 20 70 54 61 62 2e 0a 20 20 2a 2f 0a 20 20  ch pTab..  */.  
1610: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTab = sqliteFin
1620: 64 54 61 62 6c 65 28 70 44 61 74 61 2d 3e 64 62  dTable(pData->db
1630: 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20  , argv[0], 0);. 
1640: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
1650: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 53   assert( sqliteS
1660: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  trICmp(pTab->zNa
1670: 6d 65 2c 20 61 72 67 76 5b 30 5d 29 3d 3d 30 20  me, argv[0])==0 
1680: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 54 72  );.    pTab->pTr
1690: 69 67 67 65 72 20 3d 20 70 54 72 69 67 3b 20 20  igger = pTrig;  
16a0: 2f 2a 20 52 65 2d 65 6e 61 62 6c 65 20 74 72 69  /* Re-enable tri
16b0: 67 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 20 20 72  ggers */.  }.  r
16c0: 65 74 75 72 6e 20 72 63 21 3d 53 51 4c 49 54 45  eturn rc!=SQLITE
16d0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK;.}..../*.** 
16e0: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  Attempt to read 
16f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1700: 65 6d 61 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ema and initiali
1710: 7a 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 64  ze internal.** d
1720: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66  ata structures f
1730: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
1740: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
1750: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
1760: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1770: 20 67 69 76 65 6e 20 62 79 20 69 44 62 2e 20 20   given by iDb.  
1780: 69 44 62 3d 3d 30 20 69 73 20 75 73 65 64 20 66  iDb==0 is used f
1790: 6f 72 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 64  or the main.** d
17a0: 61 74 61 62 61 73 65 2e 20 20 69 44 62 3d 3d 31  atabase.  iDb==1
17b0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
17c0: 20 75 73 65 64 2e 20 20 69 44 62 3e 3d 32 20 69   used.  iDb>=2 i
17d0: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 75  s used for.** au
17e0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
17f0: 73 2e 20 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f  s.  Return one o
1800: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 20 65 72  f the SQLITE_ er
1810: 72 6f 72 20 63 6f 64 65 73 20 74 6f 0a 2a 2a 20  ror codes to.** 
1820: 69 6e 64 69 63 61 74 65 20 73 75 63 63 65 73 73  indicate success
1830: 20 6f 72 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   or failure..*/.
1840: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1850: 65 49 6e 69 74 4f 6e 65 28 73 71 6c 69 74 65 20  eInitOne(sqlite 
1860: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 68  *db, int iDb, ch
1870: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a  ar **pzErrMsg){.
1880: 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
1890: 72 73 6f 72 20 2a 63 75 72 4d 61 69 6e 3b 0a 20  rsor *curMain;. 
18a0: 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 54 61 62   int size;.  Tab
18b0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61 72  le *pTab;.  char
18c0: 20 2a 61 7a 41 72 67 5b 36 5d 3b 0a 20 20 63 68   *azArg[6];.  ch
18d0: 61 72 20 7a 44 62 4e 75 6d 5b 33 30 5d 3b 0a 20  ar zDbNum[30];. 
18e0: 20 69 6e 74 20 6d 65 74 61 5b 53 51 4c 49 54 45   int meta[SQLITE
18f0: 5f 4e 5f 42 54 52 45 45 5f 4d 45 54 41 5d 3b 0a  _N_BTREE_META];.
1900: 20 20 50 61 72 73 65 20 73 50 61 72 73 65 3b 0a    Parse sParse;.
1910: 20 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44    InitData initD
1920: 61 74 61 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ata;..  /*.  ** 
1930: 54 68 65 20 6d 61 73 74 65 72 20 64 61 74 61 62  The master datab
1940: 61 73 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  ase table has a 
1950: 73 74 72 75 63 74 75 72 65 20 6c 69 6b 65 20 74  structure like t
1960: 68 69 73 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  his.  */.  stati
1970: 63 20 63 68 61 72 20 6d 61 73 74 65 72 5f 73 63  c char master_sc
1980: 68 65 6d 61 5b 5d 20 3d 20 0a 20 20 20 20 20 22  hema[] = .     "
1990: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c  CREATE TABLE sql
19a0: 69 74 65 5f 6d 61 73 74 65 72 28 5c 6e 22 0a 20  ite_master(\n". 
19b0: 20 20 20 20 22 20 20 74 79 70 65 20 74 65 78 74      "  type text
19c0: 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 6e 61 6d  ,\n".     "  nam
19d0: 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
19e0: 22 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74  "  tbl_name text
19f0: 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 72 6f 6f  ,\n".     "  roo
1a00: 74 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e  tpage integer,\n
1a10: 22 0a 20 20 20 20 20 22 20 20 73 71 6c 20 74 65  ".     "  sql te
1a20: 78 74 5c 6e 22 0a 20 20 20 20 20 22 29 22 0a 20  xt\n".     ")". 
1a30: 20 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72   ;.  static char
1a40: 20 74 65 6d 70 5f 6d 61 73 74 65 72 5f 73 63 68   temp_master_sch
1a50: 65 6d 61 5b 5d 20 3d 20 0a 20 20 20 20 20 22 43  ema[] = .     "C
1a60: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
1a70: 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
1a80: 74 65 72 28 5c 6e 22 0a 20 20 20 20 20 22 20 20  ter(\n".     "  
1a90: 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  type text,\n".  
1aa0: 20 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c     "  name text,
1ab0: 5c 6e 22 0a 20 20 20 20 20 22 20 20 74 62 6c 5f  \n".     "  tbl_
1ac0: 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
1ad0: 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69     "  rootpage i
1ae0: 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20  nteger,\n".     
1af0: 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20  "  sql text\n". 
1b00: 20 20 20 20 22 29 22 0a 20 20 3b 0a 0a 20 20 2f      ")".  ;..  /
1b10: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1b20: 53 51 4c 20 77 69 6c 6c 20 72 65 61 64 20 74 68  SQL will read th
1b30: 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 74 68  e schema from th
1b40: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 73 2e  e master tables.
1b50: 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
1b60: 76 65 72 73 69 6f 6e 20 77 6f 72 6b 73 20 77 69  version works wi
1b70: 74 68 20 53 51 4c 69 74 65 20 66 69 6c 65 20 66  th SQLite file f
1b80: 6f 72 6d 61 74 73 20 32 20 6f 72 20 67 72 65 61  ormats 2 or grea
1b90: 74 65 72 2e 0a 20 20 2a 2a 20 54 68 65 20 73 65  ter..  ** The se
1ba0: 63 6f 6e 64 20 76 65 72 73 69 6f 6e 20 69 73 20  cond version is 
1bb0: 66 6f 72 20 66 6f 72 6d 61 74 20 31 20 66 69 6c  for format 1 fil
1bc0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65  es..  **.  ** Be
1bd0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 66 69 6c  ginning with fil
1be0: 65 20 66 6f 72 6d 61 74 20 32 2c 20 74 68 65 20  e format 2, the 
1bf0: 72 6f 77 69 64 20 66 6f 72 20 6e 65 77 20 74 61  rowid for new ta
1c00: 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
1c10: 20 28 69 6e 63 6c 75 64 69 6e 67 20 65 6e 74 72   (including entr
1c20: 69 65 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  ies in sqlite_ma
1c30: 73 74 65 72 29 20 69 73 20 61 6e 20 69 6e 63 72  ster) is an incr
1c40: 65 61 73 69 6e 67 20 69 6e 74 65 67 65 72 2e 0a  easing integer..
1c50: 20 20 2a 2a 20 53 6f 20 66 6f 72 20 66 69 6c 65    ** So for file
1c60: 20 66 6f 72 6d 61 74 20 32 20 61 6e 64 20 6c 61   format 2 and la
1c70: 74 65 72 2c 20 77 65 20 63 61 6e 20 70 6c 61 79  ter, we can play
1c80: 20 62 61 63 6b 20 73 71 6c 69 74 65 5f 6d 61 73   back sqlite_mas
1c90: 74 65 72 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ter.  ** and all
1ca0: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
1cb0: 65 6d 65 6e 74 73 20 77 69 6c 6c 20 61 70 70 65  ements will appe
1cc0: 61 72 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ar in the right 
1cd0: 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 42 75 74 20  order..  ** But 
1ce0: 77 69 74 68 20 66 69 6c 65 20 66 6f 72 6d 61 74  with file format
1cf0: 20 31 2c 20 74 61 62 6c 65 20 65 6e 74 72 69 65   1, table entrie
1d00: 73 20 77 65 72 65 20 72 61 6e 64 6f 6d 20 61 6e  s were random an
1d10: 64 20 73 6f 20 77 65 0a 20 20 2a 2a 20 68 61 76  d so we.  ** hav
1d20: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1d30: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 73  he CREATE TABLEs
1d40: 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
1d50: 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  eir correspondin
1d60: 67 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e  g.  ** CREATE IN
1d70: 44 45 58 73 2e 20 20 28 57 65 20 64 6f 6e 27 74  DEXs.  (We don't
1d80: 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69   have to deal wi
1d90: 74 68 20 43 52 45 41 54 45 20 56 49 45 57 20 6f  th CREATE VIEW o
1da0: 72 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 52  r.  ** CREATE TR
1db0: 49 47 47 45 52 20 69 6e 20 66 69 6c 65 20 66 6f  IGGER in file fo
1dc0: 72 6d 61 74 20 31 20 62 65 63 61 75 73 65 20 74  rmat 1 because t
1dd0: 68 6f 73 65 20 63 6f 6e 73 74 72 75 63 74 73 20  hose constructs 
1de0: 64 69 64 0a 20 20 2a 2a 20 6e 6f 74 20 65 78 69  did.  ** not exi
1df0: 73 74 20 74 68 65 6e 2e 29 20 0a 20 20 2a 2f 0a  st then.) .  */.
1e00: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 69 6e    static char in
1e10: 69 74 5f 73 63 72 69 70 74 5b 5d 20 3d 20 0a 20  it_script[] = . 
1e20: 20 20 20 20 22 53 45 4c 45 43 54 20 74 79 70 65      "SELECT type
1e30: 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  , name, rootpage
1e40: 2c 20 73 71 6c 2c 20 31 20 46 52 4f 4d 20 73 71  , sql, 1 FROM sq
1e50: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
1e60: 20 22 0a 20 20 20 20 20 22 55 4e 49 4f 4e 20 41   ".     "UNION A
1e70: 4c 4c 20 22 0a 20 20 20 20 20 22 53 45 4c 45 43  LL ".     "SELEC
1e80: 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 72 6f  T type, name, ro
1e90: 6f 74 70 61 67 65 2c 20 73 71 6c 2c 20 30 20 46  otpage, sql, 0 F
1ea0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1eb0: 72 22 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61  r";.  static cha
1ec0: 72 20 6f 6c 64 65 72 5f 69 6e 69 74 5f 73 63 72  r older_init_scr
1ed0: 69 70 74 5b 5d 20 3d 20 0a 20 20 20 20 20 22 53  ipt[] = .     "S
1ee0: 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d 65  ELECT type, name
1ef0: 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 2c  , rootpage, sql,
1f00: 20 31 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74   1 FROM sqlite_t
1f10: 65 6d 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  emp_master ".   
1f20: 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20    "UNION ALL ". 
1f30: 20 20 20 20 22 53 45 4c 45 43 54 20 74 79 70 65      "SELECT type
1f40: 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  , name, rootpage
1f50: 2c 20 73 71 6c 2c 20 30 20 46 52 4f 4d 20 73 71  , sql, 0 FROM sq
1f60: 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20  lite_master ".  
1f70: 20 20 20 22 57 48 45 52 45 20 74 79 70 65 3d 27     "WHERE type='
1f80: 74 61 62 6c 65 27 20 22 0a 20 20 20 20 20 22 55  table' ".     "U
1f90: 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
1fa0: 22 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61  "SELECT type, na
1fb0: 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71  me, rootpage, sq
1fc0: 6c 2c 20 30 20 46 52 4f 4d 20 73 71 6c 69 74 65  l, 0 FROM sqlite
1fd0: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 22  _master ".     "
1fe0: 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
1ff0: 78 27 22 3b 0a 0a 0a 20 20 61 73 73 65 72 74 28  x'";...  assert(
2000: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 21 3d   iDb>=0 && iDb!=
2010: 31 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  1 && iDb<db->nDb
2020: 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72   );..  /* Constr
2030: 75 63 74 20 74 68 65 20 73 63 68 65 6d 61 20 74  uct the schema t
2040: 61 62 6c 65 73 3a 20 73 71 6c 69 74 65 5f 6d 61  ables: sqlite_ma
2050: 73 74 65 72 20 61 6e 64 20 73 71 6c 69 74 65 5f  ster and sqlite_
2060: 74 65 6d 70 5f 6d 61 73 74 65 72 0a 20 20 2a 2f  temp_master.  */
2070: 0a 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 22 74  .  azArg[0] = "t
2080: 61 62 6c 65 22 3b 0a 20 20 61 7a 41 72 67 5b 31  able";.  azArg[1
2090: 5d 20 3d 20 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  ] = MASTER_NAME;
20a0: 0a 20 20 61 7a 41 72 67 5b 32 5d 20 3d 20 22 32  .  azArg[2] = "2
20b0: 22 3b 0a 20 20 61 7a 41 72 67 5b 33 5d 20 3d 20  ";.  azArg[3] = 
20c0: 6d 61 73 74 65 72 5f 73 63 68 65 6d 61 3b 0a 20  master_schema;. 
20d0: 20 73 70 72 69 6e 74 66 28 7a 44 62 4e 75 6d 2c   sprintf(zDbNum,
20e0: 20 22 25 64 22 2c 20 69 44 62 29 3b 0a 20 20 61   "%d", iDb);.  a
20f0: 7a 41 72 67 5b 34 5d 20 3d 20 7a 44 62 4e 75 6d  zArg[4] = zDbNum
2100: 3b 0a 20 20 61 7a 41 72 67 5b 35 5d 20 3d 20 30  ;.  azArg[5] = 0
2110: 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20  ;.  initData.db 
2120: 3d 20 64 62 3b 0a 20 20 69 6e 69 74 44 61 74 61  = db;.  initData
2130: 2e 70 7a 45 72 72 4d 73 67 20 3d 20 70 7a 45 72  .pzErrMsg = pzEr
2140: 72 4d 73 67 3b 0a 20 20 73 71 6c 69 74 65 49 6e  rMsg;.  sqliteIn
2150: 69 74 43 61 6c 6c 62 61 63 6b 28 26 69 6e 69 74  itCallback(&init
2160: 44 61 74 61 2c 20 35 2c 20 61 7a 41 72 67 2c 20  Data, 5, azArg, 
2170: 30 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  0);.  pTab = sql
2180: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  iteFindTable(db,
2190: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 22 6d   MASTER_NAME, "m
21a0: 61 69 6e 22 29 3b 0a 20 20 69 66 28 20 70 54 61  ain");.  if( pTa
21b0: 62 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 72  b ){.    pTab->r
21c0: 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d  eadOnly = 1;.  }
21d0: 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b  .  if( iDb==0 ){
21e0: 0a 20 20 20 20 61 7a 41 72 67 5b 31 5d 20 3d 20  .    azArg[1] = 
21f0: 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45  TEMP_MASTER_NAME
2200: 3b 0a 20 20 20 20 61 7a 41 72 67 5b 33 5d 20 3d  ;.    azArg[3] =
2210: 20 74 65 6d 70 5f 6d 61 73 74 65 72 5f 73 63 68   temp_master_sch
2220: 65 6d 61 3b 0a 20 20 20 20 61 7a 41 72 67 5b 34  ema;.    azArg[4
2230: 5d 20 3d 20 22 31 22 3b 0a 20 20 20 20 73 71 6c  ] = "1";.    sql
2240: 69 74 65 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28  iteInitCallback(
2250: 26 69 6e 69 74 44 61 74 61 2c 20 35 2c 20 61 7a  &initData, 5, az
2260: 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 70 54 61  Arg, 0);.    pTa
2270: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
2280: 62 6c 65 28 64 62 2c 20 54 45 4d 50 5f 4d 41 53  ble(db, TEMP_MAS
2290: 54 45 52 5f 4e 41 4d 45 2c 20 22 74 65 6d 70 22  TER_NAME, "temp"
22a0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 20  );.    if( pTab 
22b0: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 72  ){.      pTab->r
22c0: 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadOnly = 1;.   
22d0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65   }.  }..  /* Cre
22e0: 61 74 65 20 61 20 63 75 72 73 6f 72 20 74 6f 20  ate a cursor to 
22f0: 68 6f 6c 64 20 74 68 65 20 64 61 74 61 62 61 73  hold the databas
2300: 65 20 6f 70 65 6e 0a 20 20 2a 2f 0a 20 20 69 66  e open.  */.  if
2310: 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
2320: 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Bt==0 ) return S
2330: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d  QLITE_OK;.  rc =
2340: 20 73 71 6c 69 74 65 42 74 72 65 65 43 75 72 73   sqliteBtreeCurs
2350: 6f 72 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  or(db->aDb[iDb].
2360: 70 42 74 2c 20 32 2c 20 30 2c 20 26 63 75 72 4d  pBt, 2, 0, &curM
2370: 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ain);.  if( rc )
2380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
2390: 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20  tring(pzErrMsg, 
23a0: 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74 72  sqlite_error_str
23b0: 69 6e 67 28 72 63 29 2c 20 28 63 68 61 72 2a 29  ing(rc), (char*)
23c0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  0);.    return r
23d0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  c;.  }..  /* Get
23e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 65   the database me
23f0: 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ta information. 
2400: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2410: 65 42 74 72 65 65 47 65 74 4d 65 74 61 28 64 62  eBtreeGetMeta(db
2420: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20  ->aDb[iDb].pBt, 
2430: 6d 65 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20  meta);.  if( rc 
2440: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74  ){.    sqliteSet
2450: 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c  String(pzErrMsg,
2460: 20 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74   sqlite_error_st
2470: 72 69 6e 67 28 72 63 29 2c 20 28 63 68 61 72 2a  ring(rc), (char*
2480: 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 42  )0);.    sqliteB
2490: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
24a0: 63 75 72 4d 61 69 6e 29 3b 0a 20 20 20 20 72 65  curMain);.    re
24b0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 64  turn rc;.  }.  d
24c0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 63 68 65  b->aDb[iDb].sche
24d0: 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 6d 65 74 61  ma_cookie = meta
24e0: 5b 31 5d 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d  [1];.  if( iDb==
24f0: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 65 78  0 ){.    db->nex
2500: 74 5f 63 6f 6f 6b 69 65 20 3d 20 6d 65 74 61 5b  t_cookie = meta[
2510: 31 5d 3b 0a 20 20 20 20 64 62 2d 3e 66 69 6c 65  1];.    db->file
2520: 5f 66 6f 72 6d 61 74 20 3d 20 6d 65 74 61 5b 32  _format = meta[2
2530: 5d 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 6d 65  ];.    size = me
2540: 74 61 5b 33 5d 3b 0a 20 20 20 20 69 66 28 20 73  ta[3];.    if( s
2550: 69 7a 65 3d 3d 30 20 29 7b 20 73 69 7a 65 20 3d  ize==0 ){ size =
2560: 20 4d 41 58 5f 50 41 47 45 53 3b 20 7d 0a 20 20   MAX_PAGES; }.  
2570: 20 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65    db->cache_size
2580: 20 3d 20 73 69 7a 65 3b 0a 20 20 20 20 64 62 2d   = size;.    db-
2590: 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
25a0: 6d 65 74 61 5b 34 5d 3b 0a 20 20 20 20 69 66 28  meta[4];.    if(
25b0: 20 64 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65   db->safety_leve
25c0: 6c 3d 3d 30 20 29 20 64 62 2d 3e 73 61 66 65 74  l==0 ) db->safet
25d0: 79 5f 6c 65 76 65 6c 20 3d 20 32 3b 0a 0a 20 20  y_level = 2;..  
25e0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 66 69 6c    /*.    **  fil
25f0: 65 5f 66 6f 72 6d 61 74 3d 3d 31 20 20 20 20 56  e_format==1    V
2600: 65 72 73 69 6f 6e 20 32 2e 31 2e 30 2e 0a 20 20  ersion 2.1.0..  
2610: 20 20 2a 2a 20 20 66 69 6c 65 5f 66 6f 72 6d 61    **  file_forma
2620: 74 3d 3d 32 20 20 20 20 56 65 72 73 69 6f 6e 20  t==2    Version 
2630: 32 2e 32 2e 30 2e 20 41 64 64 20 73 75 70 70 6f  2.2.0. Add suppo
2640: 72 74 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  rt for INTEGER P
2650: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 20 20  RIMARY KEY..    
2660: 2a 2a 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d  **  file_format=
2670: 3d 33 20 20 20 20 56 65 72 73 69 6f 6e 20 32 2e  =3    Version 2.
2680: 36 2e 30 2e 20 46 69 78 20 65 6d 70 74 79 2d 73  6.0. Fix empty-s
2690: 74 72 69 6e 67 20 69 6e 64 65 78 20 62 75 67 2e  tring index bug.
26a0: 0a 20 20 20 20 2a 2a 20 20 66 69 6c 65 5f 66 6f  .    **  file_fo
26b0: 72 6d 61 74 3d 3d 34 20 20 20 20 56 65 72 73 69  rmat==4    Versi
26c0: 6f 6e 20 32 2e 37 2e 30 2e 20 41 64 64 20 73 75  on 2.7.0. Add su
26d0: 70 70 6f 72 74 20 66 6f 72 20 73 65 70 61 72 61  pport for separa
26e0: 74 65 20 6e 75 6d 65 72 69 63 20 61 6e 64 0a 20  te numeric and. 
26f0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
2700: 20 20 20 20 20 20 20 20 20 74 65 78 74 20 64 61           text da
2710: 74 61 74 79 70 65 73 2e 0a 20 20 20 20 2a 2f 0a  tatypes..    */.
2720: 20 20 20 20 69 66 28 20 64 62 2d 3e 66 69 6c 65      if( db->file
2730: 5f 66 6f 72 6d 61 74 3d 3d 30 20 29 7b 0a 20 20  _format==0 ){.  
2740: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
2750: 65 6e 73 20 69 66 20 74 68 65 20 64 61 74 61 62  ens if the datab
2760: 61 73 65 20 77 61 73 20 69 6e 69 74 69 61 6c 6c  ase was initiall
2770: 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 20  y empty */.     
2780: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
2790: 20 3d 20 34 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 4;.    }else 
27a0: 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  if( db->file_for
27b0: 6d 61 74 3e 34 20 29 7b 0a 20 20 20 20 20 20 73  mat>4 ){.      s
27c0: 71 6c 69 74 65 42 74 72 65 65 43 6c 6f 73 65 43  qliteBtreeCloseC
27d0: 75 72 73 6f 72 28 63 75 72 4d 61 69 6e 29 3b 0a  ursor(curMain);.
27e0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53        sqliteSetS
27f0: 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20  tring(pzErrMsg, 
2800: 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 69 6c  "unsupported fil
2810: 65 20 66 6f 72 6d 61 74 22 2c 20 28 63 68 61 72  e format", (char
2820: 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *)0);.      retu
2830: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2840: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2850: 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  f( db->file_form
2860: 61 74 21 3d 6d 65 74 61 5b 32 5d 20 7c 7c 20 64  at!=meta[2] || d
2870: 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3c 34  b->file_format<4
2880: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2890: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  db->file_format>
28a0: 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6d 65  =4 );.    if( me
28b0: 74 61 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ta[2]==0 ){.    
28c0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
28d0: 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 63 61 6e  g(pzErrMsg, "can
28e0: 6e 6f 74 20 61 74 74 61 63 68 20 65 6d 70 74 79  not attach empty
28f0: 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20 20   database: ",.  
2900: 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
2910: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 28 63 68 61 72  Db].zName, (char
2920: 2a 29 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  *)0);.    }else{
2930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74  .      sqliteSet
2940: 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c  String(pzErrMsg,
2950: 20 22 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66   "incompatible f
2960: 69 6c 65 20 66 6f 72 6d 61 74 20 69 6e 20 61 75  ile format in au
2970: 78 69 6c 69 61 72 79 20 22 0a 20 20 20 20 20 20  xiliary ".      
2980: 20 20 20 22 64 61 74 61 62 61 73 65 3a 20 22 2c     "database: ",
2990: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
29a0: 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
29b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29c0: 42 74 72 65 65 43 6c 6f 73 65 28 64 62 2d 3e 61  BtreeClose(db->a
29d0: 44 62 5b 69 44 62 5d 2e 70 42 74 29 3b 0a 20 20  Db[iDb].pBt);.  
29e0: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
29f0: 42 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  Bt = 0;.    retu
2a00: 72 6e 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  rn SQLITE_FORMAT
2a10: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 42 74  ;.  }.  sqliteBt
2a20: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
2a30: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
2a40: 2c 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65  , db->cache_size
2a50: 29 3b 0a 20 20 73 71 6c 69 74 65 42 74 72 65 65  );.  sqliteBtree
2a60: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 64  SetSafetyLevel(d
2a70: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c  b->aDb[iDb].pBt,
2a80: 20 6d 65 74 61 5b 34 5d 3d 3d 30 20 3f 20 32 20   meta[4]==0 ? 2 
2a90: 3a 20 6d 65 74 61 5b 34 5d 29 3b 0a 0a 20 20 2f  : meta[4]);..  /
2aa0: 2a 20 52 65 61 64 20 74 68 65 20 73 63 68 65 6d  * Read the schem
2ab0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  a information ou
2ac0: 74 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  t of the schema 
2ad0: 74 61 62 6c 65 73 0a 20 20 2a 2f 0a 20 20 6d 65  tables.  */.  me
2ae0: 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20 30 2c  mset(&sParse, 0,
2af0: 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65 29 29   sizeof(sParse))
2b00: 3b 0a 20 20 73 50 61 72 73 65 2e 64 62 20 3d 20  ;.  sParse.db = 
2b10: 64 62 3b 0a 20 20 73 50 61 72 73 65 2e 78 43 61  db;.  sParse.xCa
2b20: 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 49  llback = sqliteI
2b30: 6e 69 74 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 73  nitCallback;.  s
2b40: 50 61 72 73 65 2e 70 41 72 67 20 3d 20 28 76 6f  Parse.pArg = (vo
2b50: 69 64 2a 29 26 69 6e 69 74 44 61 74 61 3b 0a 20  id*)&initData;. 
2b60: 20 73 50 61 72 73 65 2e 69 6e 69 74 46 6c 61 67   sParse.initFlag
2b70: 20 3d 20 31 3b 0a 20 20 73 50 61 72 73 65 2e 75   = 1;.  sParse.u
2b80: 73 65 43 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  seCallback = 1;.
2b90: 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a    if( iDb==0 ){.
2ba0: 20 20 20 20 73 71 6c 69 74 65 52 75 6e 50 61 72      sqliteRunPar
2bb0: 73 65 72 28 26 73 50 61 72 73 65 2c 0a 20 20 20  ser(&sParse,.   
2bc0: 20 20 20 20 20 64 62 2d 3e 66 69 6c 65 5f 66 6f       db->file_fo
2bd0: 72 6d 61 74 3e 3d 32 20 3f 20 69 6e 69 74 5f 73  rmat>=2 ? init_s
2be0: 63 72 69 70 74 20 3a 20 6f 6c 64 65 72 5f 69 6e  cript : older_in
2bf0: 69 74 5f 73 63 72 69 70 74 2c 0a 20 20 20 20 20  it_script,.     
2c00: 20 20 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20     pzErrMsg);.  
2c10: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
2c20: 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 73  *zSql = 0;.    s
2c30: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
2c40: 7a 53 71 6c 2c 20 0a 20 20 20 20 20 20 20 22 53  zSql, .       "S
2c50: 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d 65  ELECT type, name
2c60: 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 2c  , rootpage, sql,
2c70: 20 22 2c 20 7a 44 62 4e 75 6d 2c 20 22 20 46 52   ", zDbNum, " FR
2c80: 4f 4d 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 64  OM \"",.       d
2c90: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
2ca0: 65 2c 20 22 5c 22 2e 73 71 6c 69 74 65 5f 6d 61  e, "\".sqlite_ma
2cb0: 73 74 65 72 22 2c 20 28 63 68 61 72 2a 29 30 29  ster", (char*)0)
2cc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 52 75 6e 50  ;.    sqliteRunP
2cd0: 61 72 73 65 72 28 26 73 50 61 72 73 65 2c 20 7a  arser(&sParse, z
2ce0: 53 71 6c 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a  Sql, pzErrMsg);.
2cf0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
2d00: 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Sql);.  }.  sqli
2d10: 74 65 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  teBtreeCloseCurs
2d20: 6f 72 28 63 75 72 4d 61 69 6e 29 3b 0a 20 20 69  or(curMain);.  i
2d30: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
2d40: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  _failed ){.    s
2d50: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70  qliteSetString(p
2d60: 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66  zErrMsg, "out of
2d70: 20 6d 65 6d 6f 72 79 22 2c 20 28 63 68 61 72 2a   memory", (char*
2d80: 29 30 29 3b 0a 20 20 20 20 73 50 61 72 73 65 2e  )0);.    sParse.
2d90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2da0: 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73  M;.    sqliteRes
2db0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
2dc0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  (db, 0);.  }.  i
2dd0: 66 28 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51  f( sParse.rc==SQ
2de0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 44  LITE_OK ){.    D
2df0: 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c  bSetProperty(db,
2e00: 20 69 44 62 2c 20 44 42 5f 53 63 68 65 6d 61 4c   iDb, DB_SchemaL
2e10: 6f 61 64 65 64 29 3b 0a 20 20 20 20 69 66 28 20  oaded);.    if( 
2e20: 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  iDb==0 ){.      
2e30: 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 62  DbSetProperty(db
2e40: 2c 20 31 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 1, DB_SchemaLo
2e50: 61 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  aded);.    }.  }
2e60: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
2e70: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
2e80: 65 6d 61 28 64 62 2c 20 69 44 62 29 3b 0a 20 20  ema(db, iDb);.  
2e90: 7d 0a 20 20 72 65 74 75 72 6e 20 73 50 61 72 73  }.  return sPars
2ea0: 65 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  e.rc;.}../*.** I
2eb0: 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 64 61  nitialize all da
2ec0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 2d 20 74  tabase files - t
2ed0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2ee0: 20 66 69 6c 65 2c 20 74 68 65 20 66 69 6c 65 0a   file, the file.
2ef0: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
2f00: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
2f10: 73 2c 20 61 6e 64 20 61 6e 79 20 61 64 64 69 74  s, and any addit
2f20: 69 6f 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ional database f
2f30: 69 6c 65 73 0a 2a 2a 20 63 72 65 61 74 65 64 20  iles.** created 
2f40: 75 73 69 6e 67 20 41 54 54 41 43 48 20 73 74 61  using ATTACH sta
2f50: 74 65 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  tements.  Return
2f60: 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
2f70: 20 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72    If an.** error
2f80: 20 6f 63 63 75 72 73 2c 20 77 72 69 74 65 20 61   occurs, write a
2f90: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2fa0: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
2fb0: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
2fc0: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 69 74  database is init
2fd0: 69 61 6c 69 7a 65 64 2c 20 74 68 65 20 53 51 4c  ialized, the SQL
2fe0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 0a  ITE_Initialized.
2ff0: 2a 2a 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ** bit is set in
3000: 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
3010: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20 73   of the sqlite s
3020: 74 72 75 63 74 75 72 65 2e 20 20 41 6e 0a 2a 2a  tructure.  An.**
3030: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
3040: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
3050: 68 65 20 64 61 74 61 62 61 73 65 20 61 73 20 73  he database as s
3060: 6f 6f 6e 20 61 73 20 69 74 0a 2a 2a 20 69 73 20  oon as it.** is 
3070: 6f 70 65 6e 65 64 2e 20 20 49 66 20 74 68 61 74  opened.  If that
3080: 20 66 61 69 6c 73 20 28 70 65 72 68 61 70 73 20   fails (perhaps 
3090: 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 20  because another 
30a0: 70 72 6f 63 65 73 73 0a 2a 2a 20 68 61 73 20 74  process.** has t
30b0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
30c0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 29 20 74   table locked) t
30d0: 68 61 6e 20 61 6e 6f 74 68 65 72 20 61 74 74 65  han another atte
30e0: 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
30f0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
3100: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 63  e database is ac
3110: 63 65 73 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cessed..*/.int s
3120: 71 6c 69 74 65 49 6e 69 74 28 73 71 6c 69 74 65  qliteInit(sqlite
3130: 20 2a 64 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45   *db, char **pzE
3140: 72 72 4d 73 67 29 7b 0a 20 20 69 6e 74 20 69 2c  rrMsg){.  int i,
3150: 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72 74   rc;.  .  assert
3160: 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  ( (db->flags & S
3170: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
3180: 64 29 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  d)==0 );.  rc = 
3190: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72  SQLITE_OK;.  for
31a0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
31b0: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
31c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
31d0: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
31e0: 2c 20 69 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , i, DB_SchemaLo
31f0: 61 64 65 64 29 20 29 20 63 6f 6e 74 69 6e 75 65  aded) ) continue
3200: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 21  ;.    assert( i!
3210: 3d 31 20 29 3b 20 20 2f 2a 20 53 68 6f 75 6c 64  =1 );  /* Should
3220: 20 68 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69   have been initi
3230: 61 6c 69 7a 65 64 20 74 6f 67 65 74 68 65 72 20  alized together 
3240: 77 69 74 68 20 30 20 2a 2f 0a 20 20 20 20 72 63  with 0 */.    rc
3250: 20 3d 20 73 71 6c 69 74 65 49 6e 69 74 4f 6e 65   = sqliteInitOne
3260: 28 64 62 2c 20 69 2c 20 70 7a 45 72 72 4d 73 67  (db, i, pzErrMsg
3270: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
3280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65 73  .      sqliteRes
3290: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
32a0: 28 64 62 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  (db, i);.    }. 
32b0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
32c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62  ITE_OK ){.    db
32d0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
32e0: 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20  E_Initialized;. 
32f0: 20 20 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49     sqliteCommitI
3300: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
3310: 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  b);.  }..  /* If
3320: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
3330: 20 69 6e 20 66 6f 72 6d 61 74 73 20 31 20 6f 72   in formats 1 or
3340: 20 32 2c 20 74 68 65 6e 20 75 70 67 72 61 64 65   2, then upgrade
3350: 20 69 74 20 74 6f 0a 20 20 2a 2a 20 76 65 72 73   it to.  ** vers
3360: 69 6f 6e 20 33 2e 20 20 54 68 69 73 20 77 69 6c  ion 3.  This wil
3370: 6c 20 72 65 63 6f 6e 73 74 72 75 63 74 20 61 6c  l reconstruct al
3380: 6c 20 69 6e 64 69 63 65 73 2e 20 20 49 66 20 74  l indices.  If t
3390: 68 65 0a 20 20 2a 2a 20 75 70 67 72 61 64 65 20  he.  ** upgrade 
33a0: 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
33b0: 61 73 6f 6e 20 28 65 78 3a 20 6f 75 74 20 6f 66  ason (ex: out of
33c0: 20 64 69 73 6b 20 73 70 61 63 65 2c 20 64 61 74   disk space, dat
33d0: 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 72 65  abase.  ** is re
33e0: 61 64 20 6f 6e 6c 79 2c 20 69 6e 74 65 72 72 75  ad only, interru
33f0: 70 74 20 72 65 63 65 69 76 65 64 2c 20 65 74 63  pt received, etc
3400: 2e 29 20 74 68 65 6e 20 66 61 69 6c 20 74 68 65  .) then fail the
3410: 20 69 6e 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   init..  */.  if
3420: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3430: 26 26 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d  && db->file_form
3440: 61 74 3c 33 20 29 7b 0a 20 20 20 20 63 68 61 72  at<3 ){.    char
3450: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20   *zErr = 0;.    
3460: 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61 74  InitData initDat
3470: 61 3b 0a 20 20 20 20 69 6e 74 20 6d 65 74 61 5b  a;.    int meta[
3480: 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d  SQLITE_N_BTREE_M
3490: 45 54 41 5d 3b 0a 0a 20 20 20 20 64 62 2d 3e 6d  ETA];..    db->m
34a0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
34b0: 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 20 20 69 6e  GIC_OPEN;.    in
34c0: 69 74 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a  itData.db = db;.
34d0: 20 20 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45      initData.pzE
34e0: 72 72 4d 73 67 20 3d 20 26 7a 45 72 72 3b 0a 20  rrMsg = &zErr;. 
34f0: 20 20 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d     db->file_form
3500: 61 74 20 3d 20 33 3b 0a 20 20 20 20 72 63 20 3d  at = 3;.    rc =
3510: 20 73 71 6c 69 74 65 5f 65 78 65 63 28 64 62 2c   sqlite_exec(db,
3520: 0a 20 20 20 20 20 20 22 42 45 47 49 4e 3b 20 53  .      "BEGIN; S
3530: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
3540: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
3550: 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
3560: 3b 22 2c 0a 20 20 20 20 20 20 75 70 67 72 61 64  ;",.      upgrad
3570: 65 5f 33 5f 63 61 6c 6c 62 61 63 6b 2c 0a 20 20  e_3_callback,.  
3580: 20 20 20 20 26 69 6e 69 74 44 61 74 61 2c 0a 20      &initData,. 
3590: 20 20 20 20 20 26 7a 45 72 72 29 3b 0a 20 20 20       &zErr);.   
35a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
35c0: 74 65 42 74 72 65 65 47 65 74 4d 65 74 61 28 64  teBtreeGetMeta(d
35d0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 6d  b->aDb[0].pBt, m
35e0: 65 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 74 61  eta);.      meta
35f0: 5b 32 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 73  [2] = 4;.      s
3600: 71 6c 69 74 65 42 74 72 65 65 55 70 64 61 74 65  qliteBtreeUpdate
3610: 4d 65 74 61 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Meta(db->aDb[0].
3620: 70 42 74 2c 20 6d 65 74 61 29 3b 0a 20 20 20 20  pBt, meta);.    
3630: 20 20 73 71 6c 69 74 65 5f 65 78 65 63 28 64 62    sqlite_exec(db
3640: 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
3650: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
3660: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3670: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
3680: 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  eSetString(pzErr
3690: 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 22 75  Msg, .        "u
36a0: 6e 61 62 6c 65 20 74 6f 20 75 70 67 72 61 64 65  nable to upgrade
36b0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
36c0: 20 76 65 72 73 69 6f 6e 20 32 2e 36 20 66 6f 72   version 2.6 for
36d0: 6d 61 74 22 2c 0a 20 20 20 20 20 20 20 20 7a 45  mat",.        zE
36e0: 72 72 20 3f 20 22 3a 20 22 20 3a 20 30 2c 20 7a  rr ? ": " : 0, z
36f0: 45 72 72 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Err, (char*)0);.
3700: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
3710: 5f 66 72 65 65 6d 65 6d 28 7a 45 72 72 29 3b 0a  _freemem(zErr);.
3720: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
3730: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3740: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
3750: 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64  LITE_Initialized
3760: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3770: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
3780: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6c  version of the l
3790: 69 62 72 61 72 79 0a 2a 2f 0a 63 6f 6e 73 74 20  ibrary.*/.const 
37a0: 63 68 61 72 20 72 63 73 69 64 5b 5d 20 3d 20 22  char rcsid[] = "
37b0: 40 28 23 29 20 5c 30 34 34 49 64 3a 20 53 51 4c  @(#) \044Id: SQL
37c0: 69 74 65 20 76 65 72 73 69 6f 6e 20 22 20 53 51  ite version " SQ
37d0: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 20 22 20 24  LITE_VERSION " $
37e0: 22 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 73 71  ";.const char sq
37f0: 6c 69 74 65 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d  lite_version[] =
3800: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 3b   SQLITE_VERSION;
3810: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 65 73 20 74 68 65  ../*.** Does the
3820: 20 6c 69 62 72 61 72 79 20 65 78 70 65 63 74 20   library expect 
3830: 64 61 74 61 20 74 6f 20 62 65 20 65 6e 63 6f 64  data to be encod
3840: 65 64 20 61 73 20 55 54 46 2d 38 20 6f 72 20 69  ed as UTF-8 or i
3850: 73 6f 38 38 35 39 3f 20 20 54 68 65 0a 2a 2a 20  so8859?  The.** 
3860: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
3870: 20 63 6f 6e 73 74 61 6e 74 20 61 6c 77 61 79 73   constant always
3880: 20 6c 65 74 73 20 75 73 20 6b 6e 6f 77 2e 0a 2a   lets us know..*
3890: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
38a0: 55 54 46 38 0a 63 6f 6e 73 74 20 63 68 61 72 20  UTF8.const char 
38b0: 73 71 6c 69 74 65 5f 65 6e 63 6f 64 69 6e 67 5b  sqlite_encoding[
38c0: 5d 20 3d 20 22 55 54 46 2d 38 22 3b 0a 23 65 6c  ] = "UTF-8";.#el
38d0: 73 65 0a 63 6f 6e 73 74 20 63 68 61 72 20 73 71  se.const char sq
38e0: 6c 69 74 65 5f 65 6e 63 6f 64 69 6e 67 5b 5d 20  lite_encoding[] 
38f0: 3d 20 22 69 73 6f 38 38 35 39 22 3b 0a 23 65 6e  = "iso8859";.#en
3900: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
3910: 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74  a new SQLite dat
3920: 61 62 61 73 65 2e 20 20 43 6f 6e 73 74 72 75 63  abase.  Construc
3930: 74 20 61 6e 20 22 73 71 6c 69 74 65 22 20 73 74  t an "sqlite" st
3940: 72 75 63 74 75 72 65 20 74 6f 20 64 65 66 69 6e  ructure to defin
3950: 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f  e.** the state o
3960: 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
3970: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
3980: 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74 72  nter to that str
3990: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  ucture..**.** An
39a0: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
39b0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
39c0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
39d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61  a structures tha
39e0: 74 0a 2a 2a 20 68 6f 6c 64 20 74 68 65 20 64 61  t.** hold the da
39f0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 20  tabase schema.  
3a00: 42 75 74 20 69 66 20 74 68 69 73 20 66 61 69 6c  But if this fail
3a10: 73 20 28 62 65 63 61 75 73 65 20 74 68 65 20 73  s (because the s
3a20: 63 68 65 6d 61 20 66 69 6c 65 0a 2a 2a 20 69 73  chema file.** is
3a30: 20 6c 6f 63 6b 65 64 29 20 74 68 65 6e 20 74 68   locked) then th
3a40: 61 74 20 73 74 65 70 20 69 73 20 64 65 66 65 72  at step is defer
3a50: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  red until the fi
3a60: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73  rst call to.** s
3a70: 71 6c 69 74 65 5f 65 78 65 63 28 29 2e 0a 2a 2f  qlite_exec()..*/
3a80: 0a 73 71 6c 69 74 65 20 2a 73 71 6c 69 74 65 5f  .sqlite *sqlite_
3a90: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
3aa0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
3ab0: 6d 6f 64 65 2c 20 63 68 61 72 20 2a 2a 70 7a 45  mode, char **pzE
3ac0: 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c 69 74 65  rrMsg){.  sqlite
3ad0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 2c 20   *db;.  int rc, 
3ae0: 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  i;..  /* Allocat
3af0: 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  e the sqlite dat
3b00: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
3b10: 20 64 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c   db = sqliteMall
3b20: 6f 63 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  oc( sizeof(sqlit
3b30: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 7a 45 72  e) );.  if( pzEr
3b40: 72 4d 73 67 20 29 20 2a 70 7a 45 72 72 4d 73 67  rMsg ) *pzErrMsg
3b50: 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 3d 3d   = 0;.  if( db==
3b60: 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 5f  0 ) goto no_mem_
3b70: 6f 6e 5f 6f 70 65 6e 3b 0a 20 20 64 62 2d 3e 6f  on_open;.  db->o
3b80: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61  nError = OE_Defa
3b90: 75 6c 74 3b 0a 20 20 64 62 2d 3e 70 72 69 6f 72  ult;.  db->prior
3ba0: 4e 65 77 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  NewRowid = 0;.  
3bb0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
3bc0: 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
3bd0: 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20   db->nDb = 2;.  
3be0: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
3bf0: 62 53 74 61 74 69 63 3b 0a 20 20 73 71 6c 69 74  bStatic;.  sqlit
3c00: 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  eHashInit(&db->a
3c10: 46 75 6e 63 2c 20 53 51 4c 49 54 45 5f 48 41 53  Func, SQLITE_HAS
3c20: 48 5f 53 54 52 49 4e 47 2c 20 31 29 3b 0a 20 20  H_STRING, 1);.  
3c30: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
3c40: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Db; i++){.    sq
3c50: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62  liteHashInit(&db
3c60: 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c 48 61 73 68  ->aDb[i].tblHash
3c70: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
3c80: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
3c90: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62  liteHashInit(&db
3ca0: 2d 3e 61 44 62 5b 69 5d 2e 69 64 78 48 61 73 68  ->aDb[i].idxHash
3cb0: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
3cc0: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
3cd0: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62  liteHashInit(&db
3ce0: 2d 3e 61 44 62 5b 69 5d 2e 74 72 69 67 48 61 73  ->aDb[i].trigHas
3cf0: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
3d00: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73  TRING, 0);.    s
3d10: 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64  qliteHashInit(&d
3d20: 62 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c  b->aDb[i].aFKey,
3d30: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
3d40: 49 4e 47 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 0a  ING, 1);.  }.  .
3d50: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61    /* Open the ba
3d60: 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64  ckend database d
3d70: 72 69 76 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  river */.  if( z
3d80: 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 3a 27  Filename[0]==':'
3d90: 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
3da0: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
3db0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 74  ==0 ){.    db->t
3dc0: 65 6d 70 5f 73 74 6f 72 65 20 3d 20 32 3b 0a 20  emp_store = 2;. 
3dd0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
3de0: 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
3df0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 4d   zFilename, 0, M
3e00: 41 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61  AX_PAGES, &db->a
3e10: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66  Db[0].pBt);.  if
3e20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3e30: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72  ){.    switch( r
3e40: 63 20 29 7b 0a 20 20 20 20 20 20 64 65 66 61 75  c ){.      defau
3e50: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  lt: {.        sq
3e60: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a  liteSetString(pz
3e70: 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20  ErrMsg, "unable 
3e80: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
3e90: 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
3ea0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72  zFilename, (char
3eb0: 2a 29 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *)0);.      }.  
3ec0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
3ed0: 65 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ee(db);.    sqli
3ee0: 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45  teStrRealloc(pzE
3ef0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75  rrMsg);.    retu
3f00: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  rn 0;.  }.  db->
3f10: 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22  aDb[0].zName = "
3f20: 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62  main";.  db->aDb
3f30: 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
3f40: 70 22 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70  p";..  /* Attemp
3f50: 74 20 74 6f 20 72 65 61 64 20 74 68 65 20 73 63  t to read the sc
3f60: 68 65 6d 61 20 2a 2f 0a 20 20 73 71 6c 69 74 65  hema */.  sqlite
3f70: 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
3f80: 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20  unctions(db);.  
3f90: 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69 74 28  rc = sqliteInit(
3fa0: 64 62 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  db, pzErrMsg);. 
3fb0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
3fc0: 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
3fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
3fe0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
3ff0: 20 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28 64    sqlite_close(d
4000: 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  b);.    goto no_
4010: 6d 65 6d 5f 6f 6e 5f 6f 70 65 6e 3b 0a 20 20 7d  mem_on_open;.  }
4020: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
4030: 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
4040: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
4050: 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28 64 62   sqlite_close(db
4060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 74 72  );.    sqliteStr
4070: 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67  Realloc(pzErrMsg
4080: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
4090: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45  .  }else if( pzE
40a0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c  rrMsg ){.    sql
40b0: 69 74 65 46 72 65 65 28 2a 70 7a 45 72 72 4d 73  iteFree(*pzErrMs
40c0: 67 29 3b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73  g);.    *pzErrMs
40d0: 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
40e0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
40f0: 72 20 74 6f 20 74 68 65 20 6e 65 77 6c 79 20 6f  r to the newly o
4100: 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 20 73  pened database s
4110: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 72 65  tructure */.  re
4120: 74 75 72 6e 20 64 62 3b 0a 0a 6e 6f 5f 6d 65 6d  turn db;..no_mem
4130: 5f 6f 6e 5f 6f 70 65 6e 3a 0a 20 20 73 71 6c 69  _on_open:.  sqli
4140: 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  teSetString(pzEr
4150: 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66 20 6d 65  rMsg, "out of me
4160: 6d 6f 72 79 22 2c 20 28 63 68 61 72 2a 29 30 29  mory", (char*)0)
4170: 3b 0a 20 20 73 71 6c 69 74 65 53 74 72 52 65 61  ;.  sqliteStrRea
4180: 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a  lloc(pzErrMsg);.
4190: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
41a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
41b0: 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73  ROWID of the mos
41c0: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a  t recent insert.
41d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 6c 61  */.int sqlite_la
41e0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
41f0: 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 72  sqlite *db){.  r
4200: 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f  eturn db->lastRo
4210: 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  wid;.}../*.** Re
4220: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
4230: 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68  of changes in th
4240: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
4250: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 5f 65 78 65  ll to sqlite_exe
4260: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
4270: 74 65 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74  te_changes(sqlit
4280: 65 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  e *db){.  return
4290: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a   db->nChange;.}.
42a0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
42b0: 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20  existing SQLite 
42c0: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 76 6f 69 64  database.*/.void
42d0: 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28 73 71   sqlite_close(sq
42e0: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73  lite *db){.  Has
42f0: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 6e 74 20  hElem *i;.  int 
4300: 6a 3b 0a 20 20 64 62 2d 3e 77 61 6e 74 5f 74 6f  j;.  db->want_to
4310: 5f 63 6c 6f 73 65 20 3d 20 31 3b 0a 20 20 69 66  _close = 1;.  if
4320: 28 20 73 71 6c 69 74 65 53 61 66 65 74 79 43 68  ( sqliteSafetyCh
4330: 65 63 6b 28 64 62 29 20 7c 7c 20 73 71 6c 69 74  eck(db) || sqlit
4340: 65 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29 7b  eSafetyOn(db) ){
4350: 0a 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22  .    /* printf("
4360: 44 49 44 20 4e 4f 54 20 43 4c 4f 53 45 5c 6e 22  DID NOT CLOSE\n"
4370: 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
4380: 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
4390: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 61 67 69  ;.  }.  db->magi
43a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
43b0: 5f 43 4c 4f 53 45 44 3b 0a 20 20 66 6f 72 28 6a  _CLOSED;.  for(j
43c0: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
43d0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
43e0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
43f0: 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[j];.    if( p
4400: 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Db->pBt ){.     
4410: 20 73 71 6c 69 74 65 42 74 72 65 65 43 6c 6f 73   sqliteBtreeClos
4420: 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pDb->pBt);.   
4430: 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b     pDb->pBt = 0;
4440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
4450: 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  iteResetInternal
4460: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
4470: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62   assert( db->nDb
4480: 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=2 );.  assert(
4490: 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44   db->aDb==db->aD
44a0: 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72  bStatic );.  for
44b0: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
44c0: 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20  st(&db->aFunc); 
44d0: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
44e0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 46 75 6e  ext(i)){.    Fun
44f0: 63 44 65 66 20 2a 70 46 75 6e 63 2c 20 2a 70 4e  cDef *pFunc, *pN
4500: 65 78 74 3b 0a 20 20 20 20 66 6f 72 28 70 46 75  ext;.    for(pFu
4510: 6e 63 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73  nc = (FuncDef*)s
4520: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
4530: 3b 20 70 46 75 6e 63 3b 20 70 46 75 6e 63 3d 70  ; pFunc; pFunc=p
4540: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
4550: 78 74 20 3d 20 70 46 75 6e 63 2d 3e 70 4e 65 78  xt = pFunc->pNex
4560: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  t;.      sqliteF
4570: 72 65 65 28 70 46 75 6e 63 29 3b 0a 20 20 20 20  ree(pFunc);.    
4580: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61  }.  }.  sqliteHa
4590: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75  shClear(&db->aFu
45a0: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  nc);.  sqliteFre
45b0: 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(db);.}../*.** 
45c0: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74  Rollback all dat
45d0: 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  abase files..*/.
45e0: 76 6f 69 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62  void sqliteRollb
45f0: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64  ackAll(sqlite *d
4600: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  b){.  int i;.  f
4610: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
4620: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
4630: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20   db->aDb[i].pBt 
4640: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42  ){.      sqliteB
4650: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d  treeRollback(db-
4660: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
4670: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69      db->aDb[i].i
4680: 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20  nTrans = 0;.    
4690: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 52 65  }.  }.  sqliteRe
46a0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
46b0: 61 28 64 62 2c 20 30 29 3b 0a 20 20 2f 2a 20 73  a(db, 0);.  /* s
46c0: 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b 49 6e 74  qliteRollbackInt
46d0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
46e0: 3b 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  ; */.}../*.** Ex
46f0: 65 63 75 74 65 20 53 51 4c 20 63 6f 64 65 2e 20  ecute SQL code. 
4700: 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74   Return one of t
4710: 68 65 20 53 51 4c 49 54 45 5f 20 73 75 63 63 65  he SQLITE_ succe
4720: 73 73 2f 66 61 69 6c 75 72 65 0a 2a 2a 20 63 6f  ss/failure.** co
4730: 64 65 73 2e 20 20 41 6c 73 6f 20 77 72 69 74 65  des.  Also write
4740: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
4750: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
4760: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d  tained from.** m
4770: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 61 6b 65  alloc() and make
4780: 20 2a 70 7a 45 72 72 4d 73 67 20 70 6f 69 6e 74   *pzErrMsg point
4790: 20 74 6f 20 74 68 61 74 20 6d 65 73 73 61 67 65   to that message
47a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
47b0: 51 4c 20 69 73 20 61 20 71 75 65 72 79 2c 20 74  QL is a query, t
47c0: 68 65 6e 20 66 6f 72 20 65 61 63 68 20 72 6f 77  hen for each row
47d0: 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 72 65   in the query re
47e0: 73 75 6c 74 0a 2a 2a 20 74 68 65 20 78 43 61 6c  sult.** the xCal
47f0: 6c 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  lback() function
4800: 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 70 41 72   is called.  pAr
4810: 67 20 62 65 63 6f 6d 65 73 20 74 68 65 20 66 69  g becomes the fi
4820: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  rst.** argument 
4830: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 2e 20  to xCallback(). 
4840: 20 49 66 20 78 43 61 6c 6c 62 61 63 6b 3d 4e 55   If xCallback=NU
4850: 4c 4c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62  LL then no callb
4860: 61 63 6b 0a 2a 2a 20 69 73 20 69 6e 76 6f 6b 65  ack.** is invoke
4870: 64 2c 20 65 76 65 6e 20 66 6f 72 20 71 75 65 72  d, even for quer
4880: 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ies..*/.int sqli
4890: 74 65 5f 65 78 65 63 28 0a 20 20 73 71 6c 69 74  te_exec(.  sqlit
48a0: 65 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  e *db,          
48b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
48c0: 74 61 62 61 73 65 20 6f 6e 20 77 68 69 63 68 20  tabase on which 
48d0: 74 68 65 20 53 51 4c 20 65 78 65 63 75 74 65 73  the SQL executes
48e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
48f0: 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20 20   *zSql,         
4900: 20 20 2f 2a 20 54 68 65 20 53 51 4c 20 74 6f 20    /* The SQL to 
4910: 62 65 20 65 78 65 63 75 74 65 64 20 2a 2f 0a 20  be executed */. 
4920: 20 73 71 6c 69 74 65 5f 63 61 6c 6c 62 61 63 6b   sqlite_callback
4930: 20 78 43 61 6c 6c 62 61 63 6b 2c 20 20 2f 2a 20   xCallback,  /* 
4940: 49 6e 76 6f 6b 65 20 74 68 69 73 20 63 61 6c 6c  Invoke this call
4950: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a  back routine */.
4960: 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20    void *pArg,   
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4980: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
4990: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
49a0: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
49b0: 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Msg             
49c0: 2f 2a 20 57 72 69 74 65 20 65 72 72 6f 72 20 6d  /* Write error m
49d0: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
49e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
49f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74  LITE_OK;.  const
4a00: 20 63 68 61 72 20 2a 7a 4c 65 66 74 6f 76 65 72   char *zLeftover
4a10: 3b 0a 20 20 73 71 6c 69 74 65 5f 76 6d 20 2a 70  ;.  sqlite_vm *p
4a20: 56 6d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 72 79  Vm;.  int nRetry
4a30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 43 68 61   = 0;.  int nCha
4a40: 6e 67 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  nge = 0;..  if( 
4a50: 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
4a60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 77 68   SQLITE_OK;.  wh
4a70: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
4a80: 4f 4b 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b  OK && zSql[0] ){
4a90: 0a 20 20 20 20 70 56 6d 20 3d 20 30 3b 0a 20 20  .    pVm = 0;.  
4aa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 63 6f    rc = sqlite_co
4ab0: 6d 70 69 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20  mpile(db, zSql, 
4ac0: 26 7a 4c 65 66 74 6f 76 65 72 2c 20 26 70 56 6d  &zLeftover, &pVm
4ad0: 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , pzErrMsg);.   
4ae0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4af0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
4b00: 72 74 28 20 70 56 6d 3d 3d 30 20 29 3b 0a 20 20  rt( pVm==0 );.  
4b10: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
4b20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 56 6d     }.    if( pVm
4b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
4b40: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
4b50: 74 68 65 20 7a 53 71 6c 20 69 6e 70 75 74 20 63  the zSql input c
4b60: 6f 6e 74 61 69 6e 65 64 20 6f 6e 6c 79 20 77 68  ontained only wh
4b70: 69 74 65 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  itespace */.    
4b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4b90: 20 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 2b     db->nChange +
4ba0: 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 20 20 77  = nChange;.    w
4bb0: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69  hile(1){.      i
4bc0: 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 20 20 63  nt nArg;.      c
4bd0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 2a 2a 61  har **azArg, **a
4be0: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 72 63 20 3d  zCol;.      rc =
4bf0: 20 73 71 6c 69 74 65 5f 73 74 65 70 28 70 56 6d   sqlite_step(pVm
4c00: 2c 20 26 6e 41 72 67 2c 20 28 63 6f 6e 73 74 20  , &nArg, (const 
4c10: 63 68 61 72 2a 2a 2a 29 26 61 7a 41 72 67 2c 28  char***)&azArg,(
4c20: 63 6f 6e 73 74 20 63 68 61 72 2a 2a 2a 29 26 61  const char***)&a
4c30: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  zCol);.      if(
4c40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc==SQLITE_ROW 
4c50: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ){.        if( x
4c60: 43 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e  Callback(pArg, n
4c70: 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f  Arg, azArg, azCo
4c80: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
4c90: 73 71 6c 69 74 65 5f 66 69 6e 61 6c 69 7a 65 28  sqlite_finalize(
4ca0: 70 56 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  pVm, 0);.       
4cb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4cc0: 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20  _ABORT;.        
4cd0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
4ce0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
4cf0: 74 65 5f 66 69 6e 61 6c 69 7a 65 28 70 56 6d 2c  te_finalize(pVm,
4d00: 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   pzErrMsg);.    
4d10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4d20: 54 45 5f 53 43 48 45 4d 41 20 26 26 20 6e 52 65  TE_SCHEMA && nRe
4d30: 74 72 79 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  try<2 ){.       
4d40: 20 20 20 6e 52 65 74 72 79 2b 2b 3b 0a 20 20 20     nRetry++;.   
4d50: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
4d60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
4d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4d80: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  }.        if( db
4d90: 2d 3e 70 56 64 62 65 3d 3d 30 20 29 7b 0a 20 20  ->pVdbe==0 ){.  
4da0: 20 20 20 20 20 20 20 20 6e 43 68 61 6e 67 65 20          nChange 
4db0: 3d 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  = db->nChange;. 
4dc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4dd0: 20 6e 52 65 74 72 79 20 3d 20 30 3b 0a 20 20 20   nRetry = 0;.   
4de0: 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
4df0: 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77  tover;.        w
4e00: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 53  hile( isspace(zS
4e10: 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b  ql[0]) ) zSql++;
4e20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4e40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4e50: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  .../*.** Compile
4e60: 20 61 20 73 69 6e 67 6c 65 20 73 74 61 74 65 6d   a single statem
4e70: 65 6e 74 20 6f 66 20 53 51 4c 20 69 6e 74 6f 20  ent of SQL into 
4e80: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
4e90: 65 2e 20 20 52 65 74 75 72 6e 20 6f 6e 65 0a 2a  e.  Return one.*
4ea0: 2a 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * of the SQLITE_
4eb0: 20 73 75 63 63 65 73 73 2f 66 61 69 6c 75 72 65   success/failure
4ec0: 20 63 6f 64 65 73 2e 20 20 41 6c 73 6f 20 77 72   codes.  Also wr
4ed0: 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
4ee0: 73 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 6d 65 6d  sage into.** mem
4ef0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
4f00: 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  m malloc() and m
4f10: 61 6b 65 20 2a 70 7a 45 72 72 4d 73 67 20 70 6f  ake *pzErrMsg po
4f20: 69 6e 74 20 74 6f 20 74 68 61 74 20 6d 65 73 73  int to that mess
4f30: 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
4f40: 74 65 5f 63 6f 6d 70 69 6c 65 28 0a 20 20 73 71  te_compile(.  sq
4f50: 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20  lite *db,       
4f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4f70: 20 64 61 74 61 62 61 73 65 20 6f 6e 20 77 68 69   database on whi
4f80: 63 68 20 74 68 65 20 53 51 4c 20 65 78 65 63 75  ch the SQL execu
4f90: 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tes */.  const c
4fa0: 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20  har *zSql,      
4fb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 51 4c 20       /* The SQL 
4fc0: 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 20 2a  to be executed *
4fd0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4fe0: 2a 70 7a 54 61 69 6c 2c 20 20 20 20 20 20 20 20  *pzTail,        
4ff0: 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 73 74 61  /* OUT: Next sta
5000: 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
5010: 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69   first */.  sqli
5020: 74 65 5f 76 6d 20 2a 2a 70 70 56 6d 2c 20 20 20  te_vm **ppVm,   
5030: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
5040: 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
5050: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ine */.  char **
5060: 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
5070: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69       /* OUT: Wri
5080: 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
5090: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 50  s here */.){.  P
50a0: 61 72 73 65 20 73 50 61 72 73 65 3b 0a 0a 20 20  arse sParse;..  
50b0: 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 20 2a  if( pzErrMsg ) *
50c0: 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  pzErrMsg = 0;.  
50d0: 69 66 28 20 73 71 6c 69 74 65 53 61 66 65 74 79  if( sqliteSafety
50e0: 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f 20 65 78  On(db) ) goto ex
50f0: 65 63 5f 6d 69 73 75 73 65 3b 0a 20 20 69 66 28  ec_misuse;.  if(
5100: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
5110: 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64  LITE_Initialized
5120: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
5130: 72 63 2c 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20  rc, cnt = 1;.   
5140: 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
5150: 6c 69 74 65 49 6e 69 74 28 64 62 2c 20 70 7a 45  liteInit(db, pzE
5160: 72 72 4d 73 67 29 29 3d 3d 53 51 4c 49 54 45 5f  rrMsg))==SQLITE_
5170: 42 55 53 59 0a 20 20 20 20 20 20 20 26 26 20 64  BUSY.       && d
5180: 62 2d 3e 78 42 75 73 79 43 61 6c 6c 62 61 63 6b  b->xBusyCallback
5190: 20 26 26 20 64 62 2d 3e 78 42 75 73 79 43 61 6c   && db->xBusyCal
51a0: 6c 62 61 63 6b 28 64 62 2d 3e 70 42 75 73 79 41  lback(db->pBusyA
51b0: 72 67 2c 20 22 22 2c 20 63 6e 74 2b 2b 29 21 3d  rg, "", cnt++)!=
51c0: 30 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  0 ){}.    if( rc
51d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
51e0: 20 20 20 20 20 73 71 6c 69 74 65 53 74 72 52 65       sqliteStrRe
51f0: 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b  alloc(pzErrMsg);
5200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 61 66  .      sqliteSaf
5210: 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20  etyOff(db);.    
5220: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
5230: 20 7d 0a 20 20 20 20 69 66 28 20 70 7a 45 72 72   }.    if( pzErr
5240: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
5250: 69 74 65 46 72 65 65 28 2a 70 7a 45 72 72 4d 73  iteFree(*pzErrMs
5260: 67 29 3b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72  g);.      *pzErr
5270: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Msg = 0;.    }. 
5280: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 66 69 6c   }.  if( db->fil
5290: 65 5f 66 6f 72 6d 61 74 3c 33 20 29 7b 0a 20 20  e_format<3 ){.  
52a0: 20 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 66    sqliteSafetyOf
52b0: 66 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  f(db);.    sqlit
52c0: 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  eSetString(pzErr
52d0: 4d 73 67 2c 20 22 6f 62 73 6f 6c 65 74 65 20 64  Msg, "obsolete d
52e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
52f0: 6d 61 74 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  mat", (char*)0);
5300: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5310: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
5320: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 30  if( db->pVdbe==0
5330: 20 29 7b 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20   ){ db->nChange 
5340: 3d 20 30 3b 20 7d 0a 20 20 6d 65 6d 73 65 74 28  = 0; }.  memset(
5350: 26 73 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65  &sParse, 0, size
5360: 6f 66 28 73 50 61 72 73 65 29 29 3b 0a 20 20 73  of(sParse));.  s
5370: 50 61 72 73 65 2e 64 62 20 3d 20 64 62 3b 0a 20  Parse.db = db;. 
5380: 20 73 50 61 72 73 65 2e 75 73 65 43 61 6c 6c 62   sParse.useCallb
5390: 61 63 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 64  ack = 0;.  if( d
53a0: 62 2d 3e 78 54 72 61 63 65 20 29 20 64 62 2d 3e  b->xTrace ) db->
53b0: 78 54 72 61 63 65 28 64 62 2d 3e 70 54 72 61 63  xTrace(db->pTrac
53c0: 65 41 72 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 73  eArg, zSql);.  s
53d0: 71 6c 69 74 65 52 75 6e 50 61 72 73 65 72 28 26  qliteRunParser(&
53e0: 73 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 70 7a  sParse, zSql, pz
53f0: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 73  ErrMsg);.  if( s
5400: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
5410: 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
5420: 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  eSetString(pzErr
5430: 4d 73 67 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  Msg, "out of mem
5440: 6f 72 79 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  ory", (char*)0);
5450: 0a 20 20 20 20 73 50 61 72 73 65 2e 72 63 20 3d  .    sParse.rc =
5460: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5470: 20 20 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63     sqliteRollbac
5480: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 73 71  kAll(db);.    sq
5490: 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61  liteResetInterna
54a0: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
54b0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
54c0: 20 7e 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73   ~SQLITE_InTrans
54d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 50 61 72  ;.  }.  if( sPar
54e0: 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  se.rc==SQLITE_DO
54f0: 4e 45 20 29 20 73 50 61 72 73 65 2e 72 63 20 3d  NE ) sParse.rc =
5500: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
5510: 28 20 73 50 61 72 73 65 2e 72 63 21 3d 53 51 4c  ( sParse.rc!=SQL
5520: 49 54 45 5f 4f 4b 20 26 26 20 70 7a 45 72 72 4d  ITE_OK && pzErrM
5530: 73 67 20 26 26 20 2a 70 7a 45 72 72 4d 73 67 3d  sg && *pzErrMsg=
5540: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
5550: 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d  SetString(pzErrM
5560: 73 67 2c 20 73 71 6c 69 74 65 5f 65 72 72 6f 72  sg, sqlite_error
5570: 5f 73 74 72 69 6e 67 28 73 50 61 72 73 65 2e 72  _string(sParse.r
5580: 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  c), (char*)0);. 
5590: 20 7d 0a 20 20 73 71 6c 69 74 65 53 74 72 52 65   }.  sqliteStrRe
55a0: 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b  alloc(pzErrMsg);
55b0: 0a 20 20 69 66 28 20 73 50 61 72 73 65 2e 72 63  .  if( sParse.rc
55c0: 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  ==SQLITE_SCHEMA 
55d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73  ){.    sqliteRes
55e0: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
55f0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 61  (db, 0);.  }.  a
5600: 73 73 65 72 74 28 20 70 70 56 6d 20 29 3b 0a 20  ssert( ppVm );. 
5610: 20 2a 70 70 56 6d 20 3d 20 28 73 71 6c 69 74 65   *ppVm = (sqlite
5620: 5f 76 6d 2a 29 73 50 61 72 73 65 2e 70 56 64 62  _vm*)sParse.pVdb
5630: 65 3b 0a 20 20 69 66 28 20 70 7a 54 61 69 6c 20  e;.  if( pzTail 
5640: 29 20 2a 70 7a 54 61 69 6c 20 3d 20 73 50 61 72  ) *pzTail = sPar
5650: 73 65 2e 7a 54 61 69 6c 3b 0a 20 20 69 66 28 20  se.zTail;.  if( 
5660: 73 71 6c 69 74 65 53 61 66 65 74 79 4f 66 66 28  sqliteSafetyOff(
5670: 64 62 29 20 29 20 67 6f 74 6f 20 65 78 65 63 5f  db) ) goto exec_
5680: 6d 69 73 75 73 65 3b 0a 20 20 72 65 74 75 72 6e  misuse;.  return
5690: 20 73 50 61 72 73 65 2e 72 63 3b 0a 0a 65 78 65   sParse.rc;..exe
56a0: 63 5f 6d 69 73 75 73 65 3a 0a 20 20 69 66 28 20  c_misuse:.  if( 
56b0: 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
56c0: 2a 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  *pzErrMsg = 0;. 
56d0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
56e0: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c  ng(pzErrMsg, sql
56f0: 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ite_error_string
5700: 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 2c  (SQLITE_MISUSE),
5710: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
5720: 73 71 6c 69 74 65 53 74 72 52 65 61 6c 6c 6f 63  sqliteStrRealloc
5730: 28 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a  (pzErrMsg);.  }.
5740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5750: 4d 49 53 55 53 45 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  MISUSE;.}.../*.*
5760: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
5770: 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73  routine destroys
5780: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
5790: 6e 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ne that is creat
57a0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 73 71 6c  ed by.** the sql
57b0: 69 74 65 5f 63 6f 6d 70 69 6c 65 28 29 20 72 6f  ite_compile() ro
57c0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
57d0: 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65   integer returne
57e0: 64 20 69 73 20 61 6e 20 53 51 4c 49 54 45 5f 20  d is an SQLITE_ 
57f0: 73 75 63 63 65 73 73 2f 66 61 69 6c 75 72 65 20  success/failure 
5800: 63 6f 64 65 20 74 68 61 74 20 64 65 73 63 72 69  code that descri
5810: 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c  bes.** the resul
5820: 74 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 74  t of executing t
5830: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
5840: 6e 65 2e 20 20 41 6e 20 65 72 72 6f 72 20 6d 65  ne.  An error me
5850: 73 73 61 67 65 20 69 73 0a 2a 2a 20 77 72 69 74  ssage is.** writ
5860: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
5870: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
5880: 6c 6c 6f 63 20 61 6e 64 20 2a 70 7a 45 72 72 4d  lloc and *pzErrM
5890: 73 67 20 69 73 20 6d 61 64 65 20 74 6f 0a 2a 2a  sg is made to.**
58a0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 65   point to that e
58b0: 72 72 6f 72 20 69 66 20 70 7a 45 72 72 4d 73 67  rror if pzErrMsg
58c0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 20 54   is not NULL.  T
58d0: 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
58e0: 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 75 73 65  ne.** should use
58f0: 20 73 71 6c 69 74 65 5f 66 72 65 65 6d 65 6d 28   sqlite_freemem(
5900: 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  ) to delete the 
5910: 6d 65 73 73 61 67 65 20 77 68 65 6e 20 69 74 20  message when it 
5920: 68 61 73 20 66 69 6e 69 73 68 65 64 0a 2a 2a 20  has finished.** 
5930: 77 69 74 68 20 69 74 2e 0a 2a 2f 0a 69 6e 74 20  with it..*/.int 
5940: 73 71 6c 69 74 65 5f 66 69 6e 61 6c 69 7a 65 28  sqlite_finalize(
5950: 0a 20 20 73 71 6c 69 74 65 5f 76 6d 20 2a 70 56  .  sqlite_vm *pV
5960: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
5970: 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
5980: 68 69 6e 65 20 74 6f 20 62 65 20 64 65 73 74 72  hine to be destr
5990: 6f 79 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  oyed */.  char *
59a0: 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20  *pzErrMsg       
59b0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69       /* OUT: Wri
59c0: 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
59d0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
59e0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 56 64  nt rc = sqliteVd
59f0: 62 65 46 69 6e 61 6c 69 7a 65 28 28 56 64 62 65  beFinalize((Vdbe
5a00: 2a 29 70 56 6d 2c 20 70 7a 45 72 72 4d 73 67 29  *)pVm, pzErrMsg)
5a10: 3b 0a 20 20 73 71 6c 69 74 65 53 74 72 52 65 61  ;.  sqliteStrRea
5a20: 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a  lloc(pzErrMsg);.
5a30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5a40: 2f 2a 0a 2a 2a 20 54 65 72 6d 69 6e 61 74 65 20  /*.** Terminate 
5a50: 74 68 65 20 63 75 72 72 65 6e 74 20 65 78 65 63  the current exec
5a60: 75 74 69 6f 6e 20 6f 66 20 61 20 76 69 72 74 75  ution of a virtu
5a70: 61 6c 20 6d 61 63 68 69 6e 65 20 74 68 65 6e 0a  al machine then.
5a80: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 76 69 72  ** reset the vir
5a90: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63  tual machine bac
5aa0: 6b 20 74 6f 20 69 74 73 20 73 74 61 72 74 69 6e  k to its startin
5ab0: 67 20 73 74 61 74 65 20 73 6f 20 74 68 61 74 20  g state so that 
5ac0: 69 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 75  it.** can be reu
5ad0: 73 65 64 2e 20 20 41 6e 79 20 65 72 72 6f 72 20  sed.  Any error 
5ae0: 6d 65 73 73 61 67 65 20 72 65 73 75 6c 74 69 6e  message resultin
5af0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 69 6f 72  g from the prior
5b00: 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 69 73   execution.** is
5b10: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
5b20: 7a 45 72 72 4d 73 67 2e 20 20 41 20 73 75 63 63  zErrMsg.  A succ
5b30: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ess code from th
5b40: 65 20 70 72 69 6f 72 20 65 78 65 63 75 74 69 6f  e prior executio
5b50: 6e 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  n.** is returned
5b60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f  ..*/.int sqlite_
5b70: 72 65 73 65 74 28 0a 20 20 73 71 6c 69 74 65 5f  reset(.  sqlite_
5b80: 76 6d 20 2a 70 56 6d 2c 20 20 20 20 20 20 20 20  vm *pVm,        
5b90: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
5ba0: 61 6c 20 6d 61 63 68 69 6e 65 20 74 6f 20 62 65  al machine to be
5bb0: 20 64 65 73 74 72 6f 79 65 64 20 2a 2f 0a 20 20   destroyed */.  
5bc0: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
5bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
5be0: 54 3a 20 57 72 69 74 65 20 65 72 72 6f 72 20 6d  T: Write error m
5bf0: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
5c00: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
5c10: 6c 69 74 65 56 64 62 65 52 65 73 65 74 28 28 56  liteVdbeReset((V
5c20: 64 62 65 2a 29 70 56 6d 2c 20 70 7a 45 72 72 4d  dbe*)pVm, pzErrM
5c30: 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 56 64 62  sg);.  sqliteVdb
5c40: 65 4d 61 6b 65 52 65 61 64 79 28 28 56 64 62 65  eMakeReady((Vdbe
5c50: 2a 29 70 56 6d 2c 20 2d 31 2c 20 30 2c 20 30 2c  *)pVm, -1, 0, 0,
5c60: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 53 74 72   0);.  sqliteStr
5c70: 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67  Realloc(pzErrMsg
5c80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5ca0: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
5cb0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
5cc0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
5cd0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
5ce0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
5cf0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
5d00: 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e  lite_error_strin
5d10: 67 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e  g(int rc){.  con
5d20: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77  st char *z;.  sw
5d30: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
5d40: 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20  case SQLITE_OK: 
5d50: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 6e 6f 74          z = "not
5d60: 20 61 6e 20 65 72 72 6f 72 22 3b 20 20 20 20 20   an error";     
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5d90: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
5da0: 52 3a 20 20 20 20 20 20 7a 20 3d 20 22 53 51 4c  R:      z = "SQL
5db0: 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20   logic error or 
5dc0: 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65  missing database
5dd0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
5de0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
5df0: 52 4e 41 4c 3a 20 20 20 7a 20 3d 20 22 69 6e 74  RNAL:   z = "int
5e00: 65 72 6e 61 6c 20 53 51 4c 69 74 65 20 69 6d 70  ernal SQLite imp
5e10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 66 6c 61 77  lementation flaw
5e20: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
5e30: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d  case SQLITE_PERM
5e40: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 61 63 63  :       z = "acc
5e50: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ess permission d
5e60: 65 6e 69 65 64 22 3b 20 20 20 20 20 20 20 20 20  enied";         
5e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e80: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
5e90: 54 3a 20 20 20 20 20 20 7a 20 3d 20 22 63 61 6c  T:      z = "cal
5ea0: 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20  lback requested 
5eb0: 71 75 65 72 79 20 61 62 6f 72 74 22 3b 20 20 20  query abort";   
5ec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
5ee0: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61 74  :       z = "dat
5ef0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22  abase is locked"
5f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5f10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5f20: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
5f30: 45 44 3a 20 20 20 20 20 7a 20 3d 20 22 64 61 74  ED:     z = "dat
5f40: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
5f50: 6f 63 6b 65 64 22 3b 20 20 20 20 20 20 20 20 20  ocked";         
5f60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5f70: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  case SQLITE_NOME
5f80: 4d 3a 20 20 20 20 20 20 7a 20 3d 20 22 6f 75 74  M:      z = "out
5f90: 20 6f 66 20 6d 65 6d 6f 72 79 22 3b 20 20 20 20   of memory";    
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5fc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
5fd0: 4f 4e 4c 59 3a 20 20 20 7a 20 3d 20 22 61 74 74  ONLY:   z = "att
5fe0: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20  empt to write a 
5ff0: 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73  readonly databas
6000: 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  e";  break;.    
6010: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
6020: 52 52 55 50 54 3a 20 20 7a 20 3d 20 22 69 6e 74  RRUPT:  z = "int
6030: 65 72 72 75 70 74 65 64 22 3b 20 20 20 20 20 20  errupted";      
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6060: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
6070: 52 3a 20 20 20 20 20 20 7a 20 3d 20 22 64 69 73  R:      z = "dis
6080: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 3b 20 20 20  k I/O error";   
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
60b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
60c0: 55 50 54 3a 20 20 20 20 7a 20 3d 20 22 64 61 74  UPT:    z = "dat
60d0: 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65  abase disk image
60e0: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 3b 20   is malformed"; 
60f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6100: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46  case SQLITE_NOTF
6110: 4f 55 4e 44 3a 20 20 20 7a 20 3d 20 22 74 61 62  OUND:   z = "tab
6120: 6c 65 20 6f 72 20 72 65 63 6f 72 64 20 6e 6f 74  le or record not
6130: 20 66 6f 75 6e 64 22 3b 20 20 20 20 20 20 20 20   found";        
6140: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6150: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c  case SQLITE_FULL
6160: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61 74  :       z = "dat
6170: 61 62 61 73 65 20 69 73 20 66 75 6c 6c 22 3b 20  abase is full"; 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
61a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
61b0: 4f 50 45 4e 3a 20 20 20 7a 20 3d 20 22 75 6e 61  OPEN:   z = "una
61c0: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
61d0: 62 61 73 65 20 66 69 6c 65 22 3b 20 20 20 20 20  base file";     
61e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
61f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54  case SQLITE_PROT
6200: 4f 43 4f 4c 3a 20 20 20 7a 20 3d 20 22 64 61 74  OCOL:   z = "dat
6210: 61 62 61 73 65 20 6c 6f 63 6b 69 6e 67 20 70 72  abase locking pr
6220: 6f 74 6f 63 6f 6c 20 66 61 69 6c 75 72 65 22 3b  otocol failure";
6230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6240: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
6250: 59 3a 20 20 20 20 20 20 7a 20 3d 20 22 74 61 62  Y:      z = "tab
6260: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  le contains no d
6270: 61 74 61 22 3b 20 20 20 20 20 20 20 20 20 20 20  ata";           
6280: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6290: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
62a0: 4d 41 3a 20 20 20 20 20 7a 20 3d 20 22 64 61 74  MA:     z = "dat
62b0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
62c0: 20 63 68 61 6e 67 65 64 22 3b 20 20 20 20 20 20   changed";      
62d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
62e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42  case SQLITE_TOOB
62f0: 49 47 3a 20 20 20 20 20 7a 20 3d 20 22 74 6f 6f  IG:     z = "too
6300: 20 6d 75 63 68 20 64 61 74 61 20 66 6f 72 20 6f   much data for o
6310: 6e 65 20 74 61 62 6c 65 20 72 6f 77 22 3b 20 20  ne table row";  
6320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6330: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
6340: 54 52 41 49 4e 54 3a 20 7a 20 3d 20 22 63 6f 6e  TRAINT: z = "con
6350: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 3b  straint failed";
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6380: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
6390: 41 54 43 48 3a 20 20 20 7a 20 3d 20 22 64 61 74  ATCH:   z = "dat
63a0: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 3b  atype mismatch";
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
63d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55  case SQLITE_MISU
63e0: 53 45 3a 20 20 20 20 20 7a 20 3d 20 22 6c 69 62  SE:     z = "lib
63f0: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
6400: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
6410: 6e 63 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  nce";break;.    
6420: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
6430: 53 3a 20 20 20 20 20 20 7a 20 3d 20 22 6b 65 72  S:      z = "ker
6440: 6e 65 6c 20 6c 61 63 6b 73 20 6c 61 72 67 65 20  nel lacks large 
6450: 66 69 6c 65 20 73 75 70 70 6f 72 74 22 3b 20 20  file support";  
6460: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6470: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48  case SQLITE_AUTH
6480: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 61 75 74  :       z = "aut
6490: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
64a0: 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d";             
64b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
64c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d  case SQLITE_FORM
64d0: 41 54 3a 20 20 20 20 20 7a 20 3d 20 22 61 75 78  AT:     z = "aux
64e0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
64f0: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 3b 20 20  format error";  
6500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6510: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
6520: 45 3a 20 20 20 20 20 20 7a 20 3d 20 22 62 69 6e  E:      z = "bin
6530: 64 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72  d index out of r
6540: 61 6e 67 65 22 3b 20 20 20 20 20 20 20 20 20 20  ange";          
6550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6560: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41  case SQLITE_NOTA
6570: 44 42 3a 20 20 20 20 20 7a 20 3d 20 22 66 69 6c  DB:     z = "fil
6580: 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f  e is encrypted o
6590: 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62  r is not a datab
65a0: 61 73 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ase";break;.    
65b0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
65c0: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 75 6e 6b          z = "unk
65d0: 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 20 20 20 20  nown error";    
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
6600: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
6610: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6620: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62  e implements a b
6630: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61  usy callback tha
6640: 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69  t sleeps and tri
6650: 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69  es.** again unti
6660: 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  l a timeout valu
6670: 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54  e is reached.  T
6680: 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65  he timeout value
6690: 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65   is.** an intege
66a0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
66b0: 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20  iseconds passed 
66c0: 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  in as the first.
66d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
66e0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
66f0: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
6700: 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 54 69 6d  back(. void *Tim
6710: 65 6f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  eout,           
6720: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
6730: 74 20 6f 66 20 74 69 6d 65 20 74 6f 20 77 61 69  t of time to wai
6740: 74 20 2a 2f 0a 20 63 6f 6e 73 74 20 63 68 61 72  t */. const char
6750: 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f   *NotUsed,     /
6760: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
6770: 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
6780: 62 75 73 79 20 2a 2f 0a 20 69 6e 74 20 63 6f 75  busy */. int cou
6790: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
67a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
67b0: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
67c0: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23  een busy */.){.#
67d0: 69 66 20 53 51 4c 49 54 45 5f 4d 49 4e 5f 53 4c  if SQLITE_MIN_SL
67e0: 45 45 50 5f 4d 53 3d 3d 31 0a 20 20 73 74 61 74  EEP_MS==1.  stat
67f0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 64 65  ic const char de
6800: 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  lays[] =.     { 
6810: 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c  1, 2, 5, 10, 15,
6820: 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35   20, 25, 25,  25
6830: 2c 20 20 35 30 2c 20 20 35 30 2c 20 20 35 30 2c  ,  50,  50,  50,
6840: 20 31 30 30 7d 3b 0a 20 20 73 74 61 74 69 63 20   100};.  static 
6850: 63 6f 6e 73 74 20 73 68 6f 72 74 20 69 6e 74 20  const short int 
6860: 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20  totals[] =.     
6870: 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31  { 0, 1, 3,  8, 1
6880: 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31  8, 33, 53, 78, 1
6890: 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32  03, 128, 178, 22
68a0: 38 2c 20 32 38 37 7d 3b 0a 23 20 64 65 66 69 6e  8, 287};.# defin
68b0: 65 20 4e 44 45 4c 41 59 20 28 73 69 7a 65 6f 66  e NDELAY (sizeof
68c0: 28 64 65 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28  (delays)/sizeof(
68d0: 64 65 6c 61 79 73 5b 30 5d 29 29 0a 20 20 69 6e  delays[0])).  in
68e0: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 69 6e 74  t timeout = (int
68f0: 29 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20  )Timeout;.  int 
6900: 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20  delay, prior;.. 
6910: 20 69 66 28 20 63 6f 75 6e 74 20 3c 3d 20 4e 44   if( count <= ND
6920: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
6930: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
6940: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
6950: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 2d 31 5d   totals[count-1]
6960: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
6970: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
6980: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
6990: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
69a0: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
69b0: 6f 75 6e 74 2d 4e 44 45 4c 41 59 2d 31 29 3b 0a  ount-NDELAY-1);.
69c0: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
69d0: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
69e0: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
69f0: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
6a00: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
6a10: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
6a20: 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 53 6c 65   }.  sqliteOsSle
6a30: 65 70 28 64 65 6c 61 79 29 3b 0a 20 20 72 65 74  ep(delay);.  ret
6a40: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 69  urn 1;.#else.  i
6a50: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 69 6e  nt timeout = (in
6a60: 74 29 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28  t)Timeout;.  if(
6a70: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
6a80: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
6a90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6aa0: 20 73 71 6c 69 74 65 4f 73 53 6c 65 65 70 28 31   sqliteOsSleep(1
6ab0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
6ac0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
6ad0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
6ae0: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
6af0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
6b00: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
6b10: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
6b20: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
6b30: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
6b40: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
6b50: 73 71 6c 69 74 65 5f 62 75 73 79 5f 68 61 6e 64  sqlite_busy_hand
6b60: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 20 2a 64  ler(.  sqlite *d
6b70: 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  b,.  int (*xBusy
6b80: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
6b90: 61 72 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  ar*,int),.  void
6ba0: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 64 62 2d 3e   *pArg.){.  db->
6bb0: 78 42 75 73 79 43 61 6c 6c 62 61 63 6b 20 3d 20  xBusyCallback = 
6bc0: 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 70 42 75  xBusy;.  db->pBu
6bd0: 73 79 41 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a  syArg = pArg;.}.
6be0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6bf0: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
6c00: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
6c10: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
6c20: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
6c30: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
6c40: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
6c50: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
6c60: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
6c70: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
6c80: 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72  ument. The progr
6c90: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c  ess callback wil
6ca0: 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  l.** be invoked 
6cb0: 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64  every nOps opcod
6cc0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
6cd0: 74 65 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  te_progress_hand
6ce0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 20 2a 64  ler(.  sqlite *d
6cf0: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
6d00: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
6d10: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
6d20: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 69 66  id *pArg.){.  if
6d30: 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20  ( nOps>0 ){.    
6d40: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
6d50: 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64  xProgress;.    d
6d60: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
6d70: 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e  = nOps;.    db->
6d80: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70  pProgressArg = p
6d90: 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Arg;.  }else{.  
6da0: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
6db0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  = 0;.    db->nPr
6dc0: 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20  ogressOps = 0;. 
6dd0: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
6de0: 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  Arg = 0;.  }.}.#
6df0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
6e00: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
6e10: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
6e20: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
6e30: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
6e40: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
6e50: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
6e60: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
6e70: 6e 67 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ng 0..*/.void sq
6e80: 6c 69 74 65 5f 62 75 73 79 5f 74 69 6d 65 6f 75  lite_busy_timeou
6e90: 74 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e  t(sqlite *db, in
6ea0: 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e  t ms){.  if( ms>
6eb0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f  0 ){.    sqlite_
6ec0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
6ed0: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
6ee0: 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  syCallback, (voi
6ef0: 64 2a 29 6d 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  d*)ms);.  }else{
6f00: 0a 20 20 20 20 73 71 6c 69 74 65 5f 62 75 73 79  .    sqlite_busy
6f10: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20  _handler(db, 0, 
6f20: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
6f30: 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69   Cause any pendi
6f40: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ng operation to 
6f50: 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c  stop at its earl
6f60: 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79  iest opportunity
6f70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6f80: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
6f90: 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  e *db){.  db->fl
6fa0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
6fb0: 74 65 72 72 75 70 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  terrupt;.}../*.*
6fc0: 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  * Windows system
6fd0: 73 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  s should call th
6fe0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 72  is routine to fr
6ff0: 65 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 0a 2a  ee memory that.*
7000: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  * is returned in
7010: 20 74 68 65 20 69 6e 20 74 68 65 20 65 72 72 6d   the in the errm
7020: 73 67 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20  sg parameter of 
7030: 73 71 6c 69 74 65 5f 6f 70 65 6e 28 29 20 77 68  sqlite_open() wh
7040: 65 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 69 73 20  en.** SQLite is 
7050: 61 20 44 4c 4c 2e 20 20 46 6f 72 20 73 6f 6d 65  a DLL.  For some
7060: 20 72 65 61 73 6f 6e 2c 20 69 74 20 64 6f 65 73   reason, it does
7070: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 20 63 61 6c   not work to cal
7080: 6c 20 66 72 65 65 28 29 0a 2a 2a 20 64 69 72 65  l free().** dire
7090: 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ctly..**.** Note
70a0: 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f   that we need to
70b0: 20 63 61 6c 6c 20 66 72 65 65 28 29 20 6e 6f 74   call free() not
70c0: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 68 65   sqliteFree() he
70d0: 72 65 2c 20 73 69 6e 63 65 20 65 76 65 72 79 0a  re, since every.
70e0: 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 69  ** string that i
70f0: 73 20 65 78 70 6f 72 74 65 64 20 66 72 6f 6d 20  s exported from 
7100: 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20 68 61  SQLite should ha
7110: 76 65 20 61 6c 72 65 61 64 79 20 70 61 73 73 65  ve already passe
7120: 64 20 74 68 72 6f 75 67 68 0a 2a 2a 20 73 71 6c  d through.** sql
7130: 69 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 29 2e  iteStrRealloc().
7140: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f  .*/.void sqlite_
7150: 66 72 65 65 6d 65 6d 28 76 6f 69 64 20 2a 70 29  freemem(void *p)
7160: 7b 20 66 72 65 65 28 70 29 3b 20 7d 0a 0a 2f 2a  { free(p); }../*
7170: 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74  .** Windows syst
7180: 65 6d 73 20 6e 65 65 64 20 66 75 6e 63 74 69 6f  ems need functio
7190: 6e 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 72 65  ns to call to re
71a0: 74 75 72 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  turn the sqlite_
71b0: 76 65 72 73 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73  version.** and s
71c0: 71 6c 69 74 65 5f 65 6e 63 6f 64 69 6e 67 20 73  qlite_encoding s
71d0: 74 72 69 6e 67 73 20 73 69 6e 63 65 20 74 68 65  trings since the
71e0: 79 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  y are unable to 
71f0: 61 63 63 65 73 73 20 63 6f 6e 73 74 61 6e 74 73  access constants
7200: 0a 2a 2a 20 77 69 74 68 69 6e 20 44 4c 4c 73 2e  .** within DLLs.
7210: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
7220: 73 71 6c 69 74 65 5f 6c 69 62 76 65 72 73 69 6f  sqlite_libversio
7230: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
7240: 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 3b 20  sqlite_version; 
7250: 7d 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  }.const char *sq
7260: 6c 69 74 65 5f 6c 69 62 65 6e 63 6f 64 69 6e 67  lite_libencoding
7270: 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 73  (void){ return s
7280: 71 6c 69 74 65 5f 65 6e 63 6f 64 69 6e 67 3b 20  qlite_encoding; 
7290: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
72a0: 6e 65 77 20 75 73 65 72 2d 64 65 66 69 6e 65 64  new user-defined
72b0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
72c0: 20 73 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 66   sqlite_create_f
72d0: 75 6e 63 74 69 6f 6e 28 29 0a 2a 2a 20 72 6f 75  unction().** rou
72e0: 74 69 6e 65 20 63 72 65 61 74 65 73 20 61 20 72  tine creates a r
72f0: 65 67 75 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  egular function 
7300: 61 6e 64 20 73 71 6c 69 74 65 5f 63 72 65 61 74  and sqlite_creat
7310: 65 5f 61 67 67 72 65 67 61 74 65 28 29 0a 2a 2a  e_aggregate().**
7320: 20 63 72 65 61 74 65 73 20 61 6e 20 61 67 67 72   creates an aggr
7330: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  egate function..
7340: 2a 2a 0a 2a 2a 20 50 61 73 73 69 6e 67 20 61 20  **.** Passing a 
7350: 4e 55 4c 4c 20 78 46 75 6e 63 20 61 72 67 75 6d  NULL xFunc argum
7360: 65 6e 74 20 6f 72 20 4e 55 4c 4c 20 78 53 74 65  ent or NULL xSte
7370: 70 20 61 6e 64 20 78 46 69 6e 61 6c 69 7a 65 20  p and xFinalize 
7380: 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 64 69 73  arguments.** dis
7390: 61 62 6c 65 73 20 74 68 65 20 66 75 6e 63 74 69  ables the functi
73a0: 6f 6e 2e 20 20 43 61 6c 6c 69 6e 67 20 73 71 6c  on.  Calling sql
73b0: 69 74 65 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  ite_create_funct
73c0: 69 6f 6e 28 29 20 77 69 74 68 20 74 68 65 0a 2a  ion() with the.*
73d0: 2a 20 73 61 6d 65 20 6e 61 6d 65 20 61 6e 64 20  * same name and 
73e0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
73f0: 6e 74 73 20 61 73 20 61 20 70 72 69 6f 72 20 63  nts as a prior c
7400: 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  all to.** sqlite
7410: 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
7420: 65 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65  e() disables the
7430: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 0a 2a   prior call to.*
7440: 2a 20 73 71 6c 69 74 65 5f 63 72 65 61 74 65 5f  * sqlite_create_
7450: 61 67 67 72 65 67 61 74 65 28 29 2c 20 61 6e 64  aggregate(), and
7460: 20 76 69 63 65 20 76 65 72 73 61 2e 0a 2a 2a 0a   vice versa..**.
7470: 2a 2a 20 49 66 20 6e 41 72 67 20 69 73 20 2d 31  ** If nArg is -1
7480: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
7490: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
74a0: 6c 20 61 63 63 65 70 74 20 61 6e 79 20 6e 75 6d  l accept any num
74b0: 62 65 72 0a 2a 2a 20 6f 66 20 61 72 67 75 6d 65  ber.** of argume
74c0: 6e 74 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 30  nts, including 0
74d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f  ..*/.int sqlite_
74e0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
74f0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20  .  sqlite *db,  
7500: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
7510: 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74  he function to t
7520: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
7530: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
7540: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
7550: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
7560: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 64 64   function to add
7570: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
7580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7590: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
75a0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 46  s */.  void (*xF
75b0: 75 6e 63 29 28 73 71 6c 69 74 65 5f 66 75 6e 63  unc)(sqlite_func
75c0: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
75d0: 2a 2a 29 2c 20 20 2f 2a 20 54 68 65 20 69 6d 70  **),  /* The imp
75e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
75f0: 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61   void *pUserData
7600: 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61        /* User da
7610: 74 61 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44  ta */.){.  FuncD
7620: 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61  ef *p;.  int nNa
7630: 6d 65 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20  me;.  if( db==0 
7640: 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  || zName==0 || s
7650: 71 6c 69 74 65 53 61 66 65 74 79 43 68 65 63 6b  qliteSafetyCheck
7660: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b  (db) ) return 1;
7670: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65  .  nName = strle
7680: 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  n(zName);.  if( 
7690: 6e 4e 61 6d 65 3e 32 35 35 20 29 20 72 65 74 75  nName>255 ) retu
76a0: 72 6e 20 31 3b 0a 20 20 70 20 3d 20 73 71 6c 69  rn 1;.  p = sqli
76b0: 74 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  teFindFunction(d
76c0: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
76d0: 20 6e 41 72 67 2c 20 31 29 3b 0a 20 20 69 66 28   nArg, 1);.  if(
76e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   p==0 ) return 1
76f0: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
7700: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
7710: 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 69 6e 61   = 0;.  p->xFina
7720: 6c 69 7a 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  lize = 0;.  p->p
7730: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
7740: 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30  Data;.  return 0
7750: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 5f 63  ;.}.int sqlite_c
7760: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 28  reate_aggregate(
7770: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20  .  sqlite *db,  
7780: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
7790: 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74  he function to t
77a0: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
77b0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
77c0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
77d0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
77e0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 64 64   function to add
77f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
7800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7810: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
7820: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 53  s */.  void (*xS
7830: 74 65 70 29 28 73 71 6c 69 74 65 5f 66 75 6e 63  tep)(sqlite_func
7840: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
7850: 2a 2a 29 2c 20 2f 2a 20 54 68 65 20 73 74 65 70  **), /* The step
7860: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
7870: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 69 7a 65 29  oid (*xFinalize)
7880: 28 73 71 6c 69 74 65 5f 66 75 6e 63 2a 29 2c 20  (sqlite_func*), 
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
78a0: 54 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 2a 2f  The finalizer */
78b0: 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61  .  void *pUserDa
78c0: 74 61 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20  ta      /* User 
78d0: 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e  data */.){.  Fun
78e0: 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cDef *p;.  int n
78f0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 64 62 3d 3d  Name;.  if( db==
7900: 30 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  0 || zName==0 ||
7910: 20 73 71 6c 69 74 65 53 61 66 65 74 79 43 68 65   sqliteSafetyChe
7920: 63 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  ck(db) ) return 
7930: 31 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  1;.  nName = str
7940: 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  len(zName);.  if
7950: 28 20 6e 4e 61 6d 65 3e 32 35 35 20 29 20 72 65  ( nName>255 ) re
7960: 74 75 72 6e 20 31 3b 0a 20 20 70 20 3d 20 73 71  turn 1;.  p = sq
7970: 6c 69 74 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e  liteFindFunction
7980: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  (db, zName, nNam
7990: 65 2c 20 6e 41 72 67 2c 20 31 29 3b 0a 20 20 69  e, nArg, 1);.  i
79a0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
79b0: 20 31 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d   1;.  p->xFunc =
79c0: 20 30 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d   0;.  p->xStep =
79d0: 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69   xStep;.  p->xFi
79e0: 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 69  nalize = xFinali
79f0: 7a 65 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  ze;.  p->pUserDa
7a00: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
7a10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
7a20: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7a30: 64 61 74 61 74 79 70 65 20 66 6f 72 20 61 6c 6c  datatype for all
7a40: 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20   functions with 
7a50: 61 20 67 69 76 65 6e 20 6e 61 6d 65 2e 20 20 53  a given name.  S
7a60: 65 65 20 74 68 65 0a 2a 2a 20 68 65 61 64 65 72  ee the.** header
7a70: 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 74 68 65   comment for the
7a80: 20 70 72 6f 74 6f 74 79 70 65 20 6f 66 20 74 68   prototype of th
7a90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 73  is function in s
7aa0: 71 6c 69 74 65 2e 68 20 66 6f 72 0a 2a 2a 20 61  qlite.h for.** a
7ab0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
7ac0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ation..*/.int sq
7ad0: 6c 69 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 74 79  lite_function_ty
7ae0: 70 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63  pe(sqlite *db, c
7af0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7b00: 2c 20 69 6e 74 20 64 61 74 61 54 79 70 65 29 7b  , int dataType){
7b10: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 20 3d 20  .  FuncDef *p = 
7b20: 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74 65  (FuncDef*)sqlite
7b30: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 46  HashFind(&db->aF
7b40: 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  unc, zName, strl
7b50: 65 6e 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 77 68  en(zName));.  wh
7b60: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 2d  ile( p ){.    p-
7b70: 3e 64 61 74 61 54 79 70 65 20 3d 20 64 61 74 61  >dataType = data
7b80: 54 79 70 65 3b 20 0a 20 20 20 20 70 20 3d 20 70  Type; .    p = p
7b90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  ->pNext;.  }.  r
7ba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
7bc0: 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74  er a trace funct
7bd0: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
7be0: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
7bf0: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72  ly registered tr
7c00: 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ace.** is return
7c10: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
7c20: 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f  LL trace functio
7c30: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
7c40: 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75  tracing is execu
7c50: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
7c60: 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70  .** trace is a p
7c70: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
7c80: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
7c90: 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72  oked at the star
7ca0: 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 73 71 6c  t of each.** sql
7cb0: 69 74 65 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 76  ite_exec()..*/.v
7cc0: 6f 69 64 20 2a 73 71 6c 69 74 65 5f 74 72 61 63  oid *sqlite_trac
7cd0: 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 76 6f  e(sqlite *db, vo
7ce0: 69 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69  id (*xTrace)(voi
7cf0: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c  d*,const char*),
7d00: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
7d10: 76 6f 69 64 20 2a 70 4f 6c 64 20 3d 20 64 62 2d  void *pOld = db-
7d20: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
7d30: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
7d40: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
7d50: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74  rg = pArg;.  ret
7d60: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 2a  urn pOld;.}../**
7d70: 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a  * EXPERIMENTAL *
7d80: 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  **.**.** Registe
7d90: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r a function to 
7da0: 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20  be invoked when 
7db0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  a transaction co
7dc0: 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 65 69  mments..** If ei
7dd0: 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 20 72 65  ther function re
7de0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
7df0: 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20  then the commit 
7e00: 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c  becomes a.** rol
7e10: 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  lback..*/.void *
7e20: 73 71 6c 69 74 65 5f 63 6f 6d 6d 69 74 5f 68 6f  sqlite_commit_ho
7e30: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  ok(.  sqlite *db
7e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7e50: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
7e60: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
7e70: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ase */.  int (*x
7e80: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
7e90: 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ,  /* Function t
7ea0: 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68  o invoke on each
7eb0: 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69   commit */.  voi
7ec0: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
7ed0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
7ee0: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
7ef0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
7f00: 2a 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d  *pOld = db->pCom
7f10: 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
7f20: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
7f30: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
7f40: 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
7f50: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  rg;.  return pOl
7f60: 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  d;.}.../*.** Thi
7f70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7f80: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
7f90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20  connection to a 
7fa0: 64 61 74 61 62 61 73 65 20 42 54 72 65 65 0a 2a  database BTree.*
7fb0: 2a 20 64 72 69 76 65 72 2e 20 20 49 66 20 7a 46  * driver.  If zF
7fc0: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
7fd0: 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 2c 20 74  ame of a file, t
7fe0: 68 65 6e 20 74 68 61 74 20 66 69 6c 65 20 69 73  hen that file is
7ff0: 0a 2a 2a 20 6f 70 65 6e 65 64 20 61 6e 64 20 75  .** opened and u
8000: 73 65 64 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  sed.  If zFilena
8010: 6d 65 20 69 73 20 74 68 65 20 6d 61 67 69 63 20  me is the magic 
8020: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
8030: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  then.** the data
8040: 62 61 73 65 20 69 73 20 73 74 6f 72 65 64 20 69  base is stored i
8050: 6e 20 6d 65 6d 6f 72 79 20 28 61 6e 64 20 69 73  n memory (and is
8060: 20 74 68 75 73 20 66 6f 72 67 6f 74 74 65 6e 20   thus forgotten 
8070: 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a 20 74 68  as soon as.** th
8080: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
8090: 63 6c 6f 73 65 64 2e 29 20 20 49 66 20 7a 46 69  closed.)  If zFi
80a0: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
80b0: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
80c0: 0a 2a 2a 20 69 73 20 66 6f 72 20 74 65 6d 70 6f  .** is for tempo
80d0: 72 61 72 79 20 75 73 65 20 6f 6e 6c 79 20 61 6e  rary use only an
80e0: 64 20 69 73 20 64 65 6c 65 74 65 64 20 61 73 20  d is deleted as 
80f0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 63 6f 6e 6e  soon as the conn
8100: 65 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6c 6f  ection.** is clo
8110: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 65 6d  sed..**.** A tem
8120: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
8130: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20  can be either a 
8140: 64 69 73 6b 20 66 69 6c 65 20 28 74 68 61 74 20  disk file (that 
8150: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
8160: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
8170: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
8180: 73 65 64 29 20 6f 72 20 61 20 73 65 74 20 6f 66  sed) or a set of
8190: 20 72 65 64 2d 62 6c 61 63 6b 20 74 72 65 65 73   red-black trees
81a0: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2c   held in memory,
81b0: 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  .** depending on
81c0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
81d0: 68 65 20 54 45 4d 50 5f 53 54 4f 52 45 20 63 6f  he TEMP_STORE co
81e0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 63 72 6f  mpile-time macro
81f0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 62 2d 3e   and the.** db->
8200: 74 65 6d 70 5f 73 74 6f 72 65 20 76 61 72 69 61  temp_store varia
8210: 62 6c 65 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ble, according t
8220: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
8230: 63 68 61 72 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  chart:.**.**    
8240: 20 20 20 54 45 4d 50 5f 53 54 4f 52 45 20 20 20     TEMP_STORE   
8250: 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
8260: 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66       Location of
8270: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
8280: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 2d 2d 2d  ase.**       ---
8290: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
82a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
82b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
82d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
82e0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
82f0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 0a             file.
8300: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 31 20 20  **           1  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
8330: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 31  e.**           1
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  2              m
8360: 65 6d 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  emory.**        
8370: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
8380: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
8390: 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20     file.**      
83a0: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
83b0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
83c0: 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 20       file.**    
83d0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
83e0: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
83f0: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2a         memory.**
8400: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
8410: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
8420: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
8430: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 33  y.**           3
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
8450: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  ny             m
8460: 65 6d 6f 72 79 0a 2a 2f 0a 69 6e 74 20 73 71 6c  emory.*/.int sql
8470: 69 74 65 42 74 72 65 65 46 61 63 74 6f 72 79 28  iteBtreeFactory(
8480: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 20  .  const sqlite 
8490: 2a 64 62 2c 09 20 20 20 20 2f 2a 20 4d 61 69 6e  *db,.    /* Main
84a0: 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 6f   database when o
84b0: 70 65 6e 69 6e 67 20 61 75 78 20 6f 74 68 65 72  pening aux other
84c0: 77 69 73 65 20 30 20 2a 2f 0a 20 20 63 6f 6e 73  wise 0 */.  cons
84d0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
84e0: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
84f0: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
8500: 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
8510: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
8520: 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c 20 20 20   omitJournal,   
8530: 20 20 20 20 20 20 20 2f 2a 20 69 66 20 54 52 55         /* if TRU
8540: 45 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 6f  E then do not jo
8550: 75 72 6e 61 6c 20 74 68 69 73 20 66 69 6c 65 20  urnal this file 
8560: 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 63 68 65 2c  */.  int nCache,
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8580: 2a 20 48 6f 77 20 6d 61 6e 79 20 70 61 67 65 73  * How many pages
8590: 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
85a0: 68 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  he */.  Btree **
85b0: 70 70 42 74 72 65 65 29 7b 20 20 20 20 20 20 20  ppBtree){       
85c0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
85d0: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
85e0: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
85f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 70 42 74  ..  assert( ppBt
8600: 72 65 65 20 21 3d 20 30 29 3b 0a 0a 23 69 66 6e  ree != 0);..#ifn
8610: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8620: 49 4e 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28  INMEMORYDB.  if(
8630: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
8640: 0a 20 20 20 20 69 66 20 28 54 45 4d 50 5f 53 54  .    if (TEMP_ST
8650: 4f 52 45 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ORE == 0) {.    
8660: 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 73 65 20    /* Always use 
8670: 66 69 6c 65 20 62 61 73 65 64 20 74 65 6d 70 6f  file based tempo
8680: 72 61 72 79 20 44 42 20 2a 2f 0a 20 20 20 20 20  rary DB */.     
8690: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 42 74   return sqliteBt
86a0: 72 65 65 4f 70 65 6e 28 30 2c 20 6f 6d 69 74 4a  reeOpen(0, omitJ
86b0: 6f 75 72 6e 61 6c 2c 20 6e 43 61 63 68 65 2c 20  ournal, nCache, 
86c0: 70 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d 20  ppBtree);.    } 
86d0: 65 6c 73 65 20 69 66 20 28 54 45 4d 50 5f 53 54  else if (TEMP_ST
86e0: 4f 52 45 20 3d 3d 20 31 20 7c 7c 20 54 45 4d 50  ORE == 1 || TEMP
86f0: 5f 53 54 4f 52 45 20 3d 3d 20 32 29 20 7b 0a 20  _STORE == 2) {. 
8700: 20 20 20 20 20 2f 2a 20 53 77 69 74 63 68 20 64       /* Switch d
8710: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 63 6f 6d 70  epending on comp
8720: 69 6c 65 2d 74 69 6d 65 20 61 6e 64 2f 6f 72 20  ile-time and/or 
8730: 72 75 6e 74 69 6d 65 20 73 65 74 74 69 6e 67 73  runtime settings
8740: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c  . */.      int l
8750: 6f 63 61 74 69 6f 6e 20 3d 20 64 62 2d 3e 74 65  ocation = db->te
8760: 6d 70 5f 73 74 6f 72 65 3d 3d 30 20 3f 20 54 45  mp_store==0 ? TE
8770: 4d 50 5f 53 54 4f 52 45 20 3a 20 64 62 2d 3e 74  MP_STORE : db->t
8780: 65 6d 70 5f 73 74 6f 72 65 3b 0a 0a 20 20 20 20  emp_store;..    
8790: 20 20 69 66 20 28 6c 6f 63 61 74 69 6f 6e 20 3d    if (location =
87a0: 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 72  = 1) {.        r
87b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 42 74 72 65  eturn sqliteBtre
87c0: 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  eOpen(zFilename,
87d0: 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c 20 6e 43   omitJournal, nC
87e0: 61 63 68 65 2c 20 70 70 42 74 72 65 65 29 3b 0a  ache, ppBtree);.
87f0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
8800: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
8810: 6c 69 74 65 52 62 74 72 65 65 4f 70 65 6e 28 30  liteRbtreeOpen(0
8820: 2c 20 30 2c 20 30 2c 20 70 70 42 74 72 65 65 29  , 0, 0, ppBtree)
8830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
8840: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20  else {.      /* 
8850: 41 6c 77 61 79 73 20 75 73 65 20 69 6e 2d 63 6f  Always use in-co
8860: 72 65 20 44 42 20 2a 2f 0a 20 20 20 20 20 20 72  re DB */.      r
8870: 65 74 75 72 6e 20 73 71 6c 69 74 65 52 62 74 72  eturn sqliteRbtr
8880: 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20 30 2c 20  eeOpen(0, 0, 0, 
8890: 70 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a  ppBtree);.    }.
88a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 46 69 6c    }else if( zFil
88b0: 65 6e 61 6d 65 5b 30 5d 3d 3d 27 3a 27 20 26 26  ename[0]==':' &&
88c0: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
88d0: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
88e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
88f0: 71 6c 69 74 65 52 62 74 72 65 65 4f 70 65 6e 28  qliteRbtreeOpen(
8900: 30 2c 20 30 2c 20 30 2c 20 70 70 42 74 72 65 65  0, 0, 0, ppBtree
8910: 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
8920: 66 0a 20 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  f.  {.    return
8930: 20 73 71 6c 69 74 65 42 74 72 65 65 4f 70 65 6e   sqliteBtreeOpen
8940: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 6d 69 74  (zFilename, omit
8950: 4a 6f 75 72 6e 61 6c 2c 20 6e 43 61 63 68 65 2c  Journal, nCache,
8960: 20 70 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 7d   ppBtree);.  }.}
8970: 0a                                               .