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

Artifact 8500dcd5dab93b201842b6688e0329c2b25c0d79:


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 32 32 20 32 30 30 33 2f 30 34  ,v 1.122 2003/04
0280: 2f 31 33 20 31 38 3a 32 36 3a 35 31 20 70 61 75  /13 18:26:51 pau
0290: 6c 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  l Exp $.*/.#incl
02a0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
02b0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
02c0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70  ".#include <ctyp
02d0: 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f  e.h>../*.** A po
02e0: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74  inter to this st
02f0: 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20  ructure is used 
0300: 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 69  to communicate i
0310: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 72  nformation.** fr
0320: 6f 6d 20 73 71 6c 69 74 65 49 6e 69 74 20 69 6e  om sqliteInit in
0330: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 49 6e 69  to the sqliteIni
0340: 74 43 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 74 79  tCallback..*/.ty
0350: 70 65 64 65 66 20 73 74 72 75 63 74 20 7b 0a 20  pedef struct {. 
0360: 20 73 71 6c 69 74 65 20 2a 64 62 3b 20 20 20 20   sqlite *db;    
0370: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
0380: 62 61 73 65 20 62 65 69 6e 67 20 69 6e 69 74 69  base being initi
0390: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 63 68 61 72  alized */.  char
03a0: 20 2a 2a 70 7a 45 72 72 4d 73 67 3b 20 20 20 20   **pzErrMsg;    
03b0: 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
03c0: 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
03d0: 7d 20 49 6e 69 74 44 61 74 61 3b 0a 0a 0a 2f 2a  } InitData;.../*
03e0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
03f0: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
0400: 20 66 6f 72 20 74 68 65 20 63 6f 64 65 20 74 68   for the code th
0410: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  at initializes t
0420: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  he.** database. 
0430: 20 53 65 65 20 73 71 6c 69 74 65 49 6e 69 74 28   See sqliteInit(
0440: 29 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69  ) below for addi
0450: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
0460: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 63  on..**.** Each c
0470: 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 61 69 6e 73  allback contains
0480: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
0490: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  nformation:.**.*
04a0: 2a 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20  *     argv[0] = 
04b0: 22 66 69 6c 65 2d 66 6f 72 6d 61 74 22 20 6f 72  "file-format" or
04c0: 20 22 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 22   "schema-cookie"
04d0: 20 6f 72 20 22 74 61 62 6c 65 22 20 6f 72 20 22   or "table" or "
04e0: 69 6e 64 65 78 22 0a 2a 2a 20 20 20 20 20 61 72  index".**     ar
04f0: 67 76 5b 31 5d 20 3d 20 74 61 62 6c 65 20 6f 72  gv[1] = table or
0500: 20 69 6e 64 65 78 20 6e 61 6d 65 20 6f 72 20 6d   index name or m
0510: 65 74 61 20 73 74 61 74 65 6d 65 6e 74 20 74 79  eta statement ty
0520: 70 65 2e 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b  pe..**     argv[
0530: 32 5d 20 3d 20 72 6f 6f 74 20 70 61 67 65 20 6e  2] = root page n
0540: 75 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20  umber for table 
0550: 6f 72 20 69 6e 64 65 78 2e 20 20 4e 55 4c 4c 20  or index.  NULL 
0560: 66 6f 72 20 6d 65 74 61 2e 0a 2a 2a 20 20 20 20  for meta..**    
0570: 20 61 72 67 76 5b 33 5d 20 3d 20 53 51 4c 20 74   argv[3] = SQL t
0580: 65 78 74 20 66 6f 72 20 61 20 43 52 45 41 54 45  ext for a CREATE
0590: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
05a0: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
05b0: 2e 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 34 5d  ..**     argv[4]
05c0: 20 3d 20 22 31 22 20 66 6f 72 20 74 65 6d 70 6f   = "1" for tempo
05d0: 72 61 72 79 20 66 69 6c 65 73 2c 20 22 30 22 20  rary files, "0" 
05e0: 66 6f 72 20 6d 61 69 6e 20 64 61 74 61 62 61 73  for main databas
05f0: 65 2c 20 22 32 22 20 6f 72 20 6d 6f 72 65 0a 2a  e, "2" or more.*
0600: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0610: 66 6f 72 20 61 75 78 69 6c 69 61 72 79 20 64 61  for auxiliary da
0620: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
0630: 0a 2a 2f 0a 73 74 61 74 69 63 0a 69 6e 74 20 73  .*/.static.int s
0640: 71 6c 69 74 65 49 6e 69 74 43 61 6c 6c 62 61 63  qliteInitCallbac
0650: 6b 28 76 6f 69 64 20 2a 70 49 6e 69 74 2c 20 69  k(void *pInit, i
0660: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
0670: 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 61 7a 43  argv, char **azC
0680: 6f 6c 4e 61 6d 65 29 7b 0a 20 20 49 6e 69 74 44  olName){.  InitD
0690: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 49 6e  ata *pData = (In
06a0: 69 74 44 61 74 61 2a 29 70 49 6e 69 74 3b 0a 20  itData*)pInit;. 
06b0: 20 50 61 72 73 65 20 73 50 61 72 73 65 3b 0a 20   Parse sParse;. 
06c0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
06d0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f 20 73 6f    /* TODO: Do so
06e0: 6d 65 20 76 61 6c 69 64 69 74 79 20 63 68 65 63  me validity chec
06f0: 6b 73 20 6f 6e 20 61 6c 6c 20 66 69 65 6c 64 73  ks on all fields
0700: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
0710: 2c 0a 20 20 2a 2a 20 6d 61 6b 65 20 73 75 72 65  ,.  ** make sure
0720: 20 66 69 65 6c 64 73 20 64 6f 20 6e 6f 74 20 63   fields do not c
0730: 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 2e 20 4f 74  ontain NULLs. Ot
0740: 68 65 72 77 69 73 65 20 77 65 20 6d 69 67 68 74  herwise we might
0750: 20 63 6f 72 65 0a 20 20 2a 2a 20 77 68 65 6e 20   core.  ** when 
0760: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 69 6e  attempting to in
0770: 69 74 69 61 6c 69 7a 65 20 66 72 6f 6d 20 61 20  itialize from a 
0780: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
0790: 20 66 69 6c 65 2e 20 2a 2f 0a 0a 20 20 61 73 73   file. */..  ass
07a0: 65 72 74 28 20 61 72 67 63 3d 3d 35 20 29 3b 0a  ert( argc==5 );.
07b0: 20 20 73 77 69 74 63 68 28 20 61 72 67 76 5b 30    switch( argv[0
07c0: 5d 5b 30 5d 20 29 7b 0a 20 20 20 20 63 61 73 65  ][0] ){.    case
07d0: 20 27 76 27 3a 0a 20 20 20 20 63 61 73 65 20 27   'v':.    case '
07e0: 69 27 3a 0a 20 20 20 20 63 61 73 65 20 27 74 27  i':.    case 't'
07f0: 3a 20 7b 20 20 2f 2a 20 43 52 45 41 54 45 20 54  : {  /* CREATE T
0800: 41 42 4c 45 2c 20 43 52 45 41 54 45 20 49 4e 44  ABLE, CREATE IND
0810: 45 58 2c 20 6f 72 20 43 52 45 41 54 45 20 56 49  EX, or CREATE VI
0820: 45 57 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  EW statements */
0830: 0a 20 20 20 20 20 20 69 66 28 20 61 72 67 76 5b  .      if( argv[
0840: 33 5d 20 26 26 20 61 72 67 76 5b 33 5d 5b 30 5d  3] && argv[3][0]
0850: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
0860: 61 6c 6c 20 74 68 65 20 70 61 72 73 65 72 20 74  all the parser t
0870: 6f 20 70 72 6f 63 65 73 73 20 61 20 43 52 45 41  o process a CREA
0880: 54 45 20 54 41 42 4c 45 2c 20 49 4e 44 45 58 20  TE TABLE, INDEX 
0890: 6f 72 20 56 49 45 57 2e 0a 20 20 20 20 20 20 20  or VIEW..       
08a0: 20 2a 2a 20 42 75 74 20 62 65 63 61 75 73 65 20   ** But because 
08b0: 73 50 61 72 73 65 2e 69 6e 69 74 46 6c 61 67 20  sParse.initFlag 
08c0: 69 73 20 73 65 74 20 74 6f 20 31 2c 20 6e 6f 20  is set to 1, no 
08d0: 56 44 42 45 20 63 6f 64 65 20 69 73 20 67 65 6e  VDBE code is gen
08e0: 65 72 61 74 65 64 0a 20 20 20 20 20 20 20 20 2a  erated.        *
08f0: 2a 20 6f 72 20 65 78 65 63 75 74 65 64 2e 20 20  * or executed.  
0900: 41 6c 6c 20 74 68 65 20 70 61 72 73 65 72 20 64  All the parser d
0910: 6f 65 73 20 69 73 20 62 75 69 6c 64 20 74 68 65  oes is build the
0920: 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 0a 20   internal data. 
0930: 20 20 20 20 20 20 20 2a 2a 20 73 74 72 75 63 74         ** struct
0940: 75 72 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ures that descri
0950: 62 65 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e  be the table, in
0960: 64 65 78 2c 20 6f 72 20 76 69 65 77 2e 0a 20 20  dex, or view..  
0970: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
0980: 20 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65 2c   memset(&sParse,
0990: 20 30 2c 20 73 69 7a 65 6f 66 28 73 50 61 72 73   0, sizeof(sPars
09a0: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73 50 61  e));.        sPa
09b0: 72 73 65 2e 64 62 20 3d 20 70 44 61 74 61 2d 3e  rse.db = pData->
09c0: 64 62 3b 0a 20 20 20 20 20 20 20 20 73 50 61 72  db;.        sPar
09d0: 73 65 2e 69 6e 69 74 46 6c 61 67 20 3d 20 31 3b  se.initFlag = 1;
09e0: 0a 20 20 20 20 20 20 20 20 73 50 61 72 73 65 2e  .        sParse.
09f0: 69 44 62 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  iDb = atoi(argv[
0a00: 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 50 61  4]);.        sPa
0a10: 72 73 65 2e 6e 65 77 54 6e 75 6d 20 3d 20 61 74  rse.newTnum = at
0a20: 6f 69 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  oi(argv[2]);.   
0a30: 20 20 20 20 20 73 50 61 72 73 65 2e 75 73 65 43       sParse.useC
0a40: 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  allback = 1;.   
0a50: 20 20 20 20 20 73 71 6c 69 74 65 52 75 6e 50 61       sqliteRunPa
0a60: 72 73 65 72 28 26 73 50 61 72 73 65 2c 20 61 72  rser(&sParse, ar
0a70: 67 76 5b 33 5d 2c 20 70 44 61 74 61 2d 3e 70 7a  gv[3], pData->pz
0a80: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  ErrMsg);.      }
0a90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
0aa0: 20 49 66 20 74 68 65 20 53 51 4c 20 63 6f 6c 75   If the SQL colu
0ab0: 6d 6e 20 69 73 20 62 6c 61 6e 6b 20 69 74 20 6d  mn is blank it m
0ac0: 65 61 6e 73 20 74 68 69 73 20 69 73 20 61 6e 20  eans this is an 
0ad0: 69 6e 64 65 78 20 74 68 61 74 0a 20 20 20 20 20  index that.     
0ae0: 20 20 20 2a 2a 20 77 61 73 20 63 72 65 61 74 65     ** was create
0af0: 64 20 74 6f 20 62 65 20 74 68 65 20 50 52 49 4d  d to be the PRIM
0b00: 41 52 59 20 4b 45 59 20 6f 72 20 74 6f 20 66 75  ARY KEY or to fu
0b10: 6c 66 69 6c 6c 20 61 20 55 4e 49 51 55 45 0a 20  lfill a UNIQUE. 
0b20: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
0b30: 61 69 6e 74 20 66 6f 72 20 61 20 43 52 45 41 54  aint for a CREAT
0b40: 45 20 54 41 42 4c 45 2e 20 20 54 68 65 20 69 6e  E TABLE.  The in
0b50: 64 65 78 20 73 68 6f 75 6c 64 20 68 61 76 65 20  dex should have 
0b60: 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 20 20  already.        
0b70: 2a 2a 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ** been created 
0b80: 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73 73 65  when we processe
0b90: 64 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  d the CREATE TAB
0ba0: 4c 45 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65  LE.  All we have
0bb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 64  .        ** to d
0bc0: 6f 20 68 65 72 65 20 69 73 20 72 65 63 6f 72 64  o here is record
0bd0: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
0be0: 75 6d 62 65 72 20 66 6f 72 20 74 68 61 74 20 69  umber for that i
0bf0: 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
0c00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62  .        int iDb
0c10: 3b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  ;.        Index 
0c20: 2a 70 49 6e 64 65 78 3b 0a 0a 20 20 20 20 20 20  *pIndex;..      
0c30: 20 20 69 44 62 20 3d 20 61 74 6f 69 28 61 72 67    iDb = atoi(arg
0c40: 76 5b 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 61  v[4]);.        a
0c50: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
0c60: 20 69 44 62 3c 70 44 61 74 61 2d 3e 64 62 2d 3e   iDb<pData->db->
0c70: 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70  nDb );.        p
0c80: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69  Index = sqliteFi
0c90: 6e 64 49 6e 64 65 78 28 70 44 61 74 61 2d 3e 64  ndIndex(pData->d
0ca0: 62 2c 20 61 72 67 76 5b 31 5d 2c 20 70 44 61 74  b, argv[1], pDat
0cb0: 61 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  a->db->aDb[iDb].
0cc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
0cd0: 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 7c 7c  if( pIndex==0 ||
0ce0: 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 21 3d 30   pIndex->tnum!=0
0cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
0d00: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20   This can occur 
0d10: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
0d20: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 61 20 54 45  an index on a TE
0d30: 4d 50 20 74 61 62 6c 65 20 77 68 69 63 68 0a 20  MP table which. 
0d40: 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
0d50: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
0d60: 20 61 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 6f   another index o
0d70: 6e 20 61 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e  n a permanent in
0d80: 64 65 78 2e 20 20 53 69 6e 63 65 0a 20 20 20 20  dex.  Since.    
0d90: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72        ** the per
0da0: 6d 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20  manent table is 
0db0: 68 69 64 64 65 6e 20 62 79 20 74 68 65 20 54 45  hidden by the TE
0dc0: 4d 50 20 74 61 62 6c 65 2c 20 77 65 20 63 61 6e  MP table, we can
0dd0: 20 61 6c 73 6f 0a 20 20 20 20 20 20 20 20 20 20   also.          
0de0: 2a 2a 20 73 61 66 65 6c 79 20 69 67 6e 6f 72 65  ** safely ignore
0df0: 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 68   the index on th
0e00: 65 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c  e permanent tabl
0e10: 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
0e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
0e30: 4e 6f 74 68 69 6e 67 20 2a 2f 3b 0a 20 20 20 20  Nothing */;.    
0e40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0e50: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75       pIndex->tnu
0e60: 6d 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 32 5d  m = atoi(argv[2]
0e70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
0e80: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
0e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
0ea0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
0eb0: 54 68 69 73 20 63 61 6e 20 6e 6f 74 20 68 61 70  This can not hap
0ec0: 70 65 6e 21 20 2a 2f 0a 20 20 20 20 20 20 6e 45  pen! */.      nE
0ed0: 72 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  rr = 1;.      as
0ee0: 73 65 72 74 28 20 6e 45 72 72 3d 3d 30 20 29 3b  sert( nErr==0 );
0ef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0f00: 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn nErr;.}../*.
0f10: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 61 6c  ** This is a cal
0f20: 6c 62 61 63 6b 20 70 72 6f 63 65 64 75 72 65 20  lback procedure 
0f30: 75 73 65 64 20 74 6f 20 72 65 63 6f 6e 73 74 72  used to reconstr
0f40: 75 63 74 20 61 20 74 61 62 6c 65 2e 20 20 54 68  uct a table.  Th
0f50: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  e.** name of the
0f60: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 72 65 63   table to be rec
0f70: 6f 6e 73 74 72 75 63 74 65 64 20 69 73 20 70 61  onstructed is pa
0f80: 73 73 65 64 20 69 6e 20 61 73 20 61 72 67 76 5b  ssed in as argv[
0f90: 30 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  0]..**.** This r
0fa0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
0fb0: 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
0fc0: 75 70 67 72 61 64 65 20 61 20 64 61 74 61 62 61  upgrade a databa
0fd0: 73 65 20 66 72 6f 6d 0a 2a 2a 20 66 6f 72 6d 61  se from.** forma
0fe0: 74 20 76 65 72 73 69 6f 6e 20 31 20 6f 72 20 32  t version 1 or 2
0ff0: 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 20 20   to version 3.  
1000: 54 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72  The correct oper
1010: 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 69 73  ation of.** this
1020: 20 72 6f 75 74 69 6e 65 20 72 65 6c 79 73 20 6f   routine relys o
1030: 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
1040: 6e 6f 20 69 6e 64 69 63 65 73 20 61 72 65 20 75  no indices are u
1050: 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 70 79  sed when.** copy
1060: 69 6e 67 20 61 20 74 61 62 6c 65 20 6f 75 74 20  ing a table out 
1070: 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  to a temporary f
1080: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 0a 69  ile..*/.static.i
1090: 6e 74 20 75 70 67 72 61 64 65 5f 33 5f 63 61 6c  nt upgrade_3_cal
10a0: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 49 6e 69  lback(void *pIni
10b0: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  t, int argc, cha
10c0: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
10d0: 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 49 6e 69  *NotUsed){.  Ini
10e0: 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28  tData *pData = (
10f0: 49 6e 69 74 44 61 74 61 2a 29 70 49 6e 69 74 3b  InitData*)pInit;
1100: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 61 62  .  int rc;.  Tab
1110: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 54 72 69 67  le *pTab;.  Trig
1120: 67 65 72 20 2a 70 54 72 69 67 3b 0a 20 20 63 68  ger *pTrig;.  ch
1130: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20  ar *zErr = 0;.. 
1140: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69   pTab = sqliteFi
1150: 6e 64 54 61 62 6c 65 28 70 44 61 74 61 2d 3e 64  ndTable(pData->d
1160: 62 2c 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a  b, argv[0], 0);.
1170: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
1180: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
1190: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 54 61  qliteStrICmp(pTa
11a0: 62 2d 3e 7a 4e 61 6d 65 2c 20 61 72 67 76 5b 30  b->zName, argv[0
11b0: 5d 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ])==0 );.  if( p
11c0: 54 61 62 20 29 7b 0a 20 20 20 20 70 54 72 69 67  Tab ){.    pTrig
11d0: 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65   = pTab->pTrigge
11e0: 72 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 54 72  r;.    pTab->pTr
11f0: 69 67 67 65 72 20 3d 20 30 3b 20 20 2f 2a 20 44  igger = 0;  /* D
1200: 69 73 61 62 6c 65 20 61 6c 6c 20 74 72 69 67 67  isable all trigg
1210: 65 72 73 20 62 65 66 6f 72 65 20 72 65 62 75 69  ers before rebui
1220: 6c 64 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20  lding the table 
1230: 2a 2f 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  */.  }.  rc = sq
1240: 6c 69 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66  lite_exec_printf
1250: 28 70 44 61 74 61 2d 3e 64 62 2c 0a 20 20 20 20  (pData->db,.    
1260: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
1270: 4c 45 20 73 71 6c 69 74 65 5f 78 20 41 53 20 53  LE sqlite_x AS S
1280: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 25 71  ELECT * FROM '%q
1290: 27 3b 20 22 0a 20 20 20 20 22 44 45 4c 45 54 45  '; ".    "DELETE
12a0: 20 46 52 4f 4d 20 27 25 71 27 3b 20 22 0a 20 20   FROM '%q'; ".  
12b0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27    "INSERT INTO '
12c0: 25 71 27 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  %q' SELECT * FRO
12d0: 4d 20 73 71 6c 69 74 65 5f 78 3b 20 22 0a 20 20  M sqlite_x; ".  
12e0: 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 73 71    "DROP TABLE sq
12f0: 6c 69 74 65 5f 78 3b 22 2c 0a 20 20 20 20 30 2c  lite_x;",.    0,
1300: 20 30 2c 20 26 7a 45 72 72 2c 20 61 72 67 76 5b   0, &zErr, argv[
1310: 30 5d 2c 20 61 72 67 76 5b 30 5d 2c 20 61 72 67  0], argv[0], arg
1320: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 45 72  v[0]);.  if( zEr
1330: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  r ){.    sqliteS
1340: 65 74 53 74 72 69 6e 67 28 70 44 61 74 61 2d 3e  etString(pData->
1350: 70 7a 45 72 72 4d 73 67 2c 20 7a 45 72 72 2c 20  pzErrMsg, zErr, 
1360: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 66  0);.    sqlite_f
1370: 72 65 65 6d 65 6d 28 7a 45 72 72 29 3b 0a 20 20  reemem(zErr);.  
1380: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
1390: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20  ror occurred in 
13a0: 74 68 65 20 53 51 4c 20 61 62 6f 76 65 2c 20 74  the SQL above, t
13b0: 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
13c0: 69 6f 6e 20 77 69 6c 6c 0a 20 20 2a 2a 20 72 6f  ion will.  ** ro
13d0: 6c 6c 62 61 63 6b 20 77 68 69 63 68 20 77 69 6c  llback which wil
13e0: 6c 20 64 65 6c 65 74 65 20 74 68 65 20 69 6e 74  l delete the int
13f0: 65 72 6e 61 6c 20 73 79 6d 62 6f 6c 20 74 61 62  ernal symbol tab
1400: 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  les.  This will.
1410: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 73    ** cause the s
1420: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70 54  tructure that pT
1430: 61 62 20 70 6f 69 6e 74 73 20 74 6f 20 62 65 20  ab points to be 
1440: 64 65 6c 65 74 65 64 2e 20 20 49 6e 20 63 61 73  deleted.  In cas
1450: 65 20 74 68 61 74 0a 20 20 2a 2a 20 68 61 70 70  e that.  ** happ
1460: 65 6e 65 64 2c 20 77 65 20 6e 65 65 64 20 74 6f  ened, we need to
1470: 20 72 65 66 65 74 63 68 20 70 54 61 62 2e 0a 20   refetch pTab.. 
1480: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   */.  pTab = sql
1490: 69 74 65 46 69 6e 64 54 61 62 6c 65 28 70 44 61  iteFindTable(pDa
14a0: 74 61 2d 3e 64 62 2c 20 61 72 67 76 5b 30 5d 2c  ta->db, argv[0],
14b0: 20 30 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20   0);.  if( pTab 
14c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
14d0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 54 61  qliteStrICmp(pTa
14e0: 62 2d 3e 7a 4e 61 6d 65 2c 20 61 72 67 76 5b 30  b->zName, argv[0
14f0: 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  ])==0 );.    pTa
1500: 62 2d 3e 70 54 72 69 67 67 65 72 20 3d 20 70 54  b->pTrigger = pT
1510: 72 69 67 3b 20 20 2f 2a 20 52 65 2d 65 6e 61 62  rig;  /* Re-enab
1520: 6c 65 20 74 72 69 67 67 65 72 73 20 2a 2f 0a 20  le triggers */. 
1530: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d   }.  return rc!=
1540: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
1550: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1560: 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
1570: 73 65 20 73 63 68 65 6d 61 20 61 6e 64 20 69 6e  se schema and in
1580: 69 74 69 61 6c 69 7a 65 20 69 6e 74 65 72 6e 61  itialize interna
1590: 6c 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  l.** data struct
15a0: 75 72 65 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ures for a singl
15b0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15c0: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
15d0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
15e0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 20  ile is given by 
15f0: 69 44 62 2e 20 20 69 44 62 3d 3d 30 20 69 73 20  iDb.  iDb==0 is 
1600: 75 73 65 64 20 66 6f 72 20 74 68 65 20 6d 61 69  used for the mai
1610: 6e 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20  n.** database.  
1620: 69 44 62 3d 3d 31 20 73 68 6f 75 6c 64 20 6e 65  iDb==1 should ne
1630: 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 69 44  ver be used.  iD
1640: 62 3e 3d 32 20 69 73 20 75 73 65 64 20 66 6f 72  b>=2 is used for
1650: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
1660: 74 61 62 61 73 65 73 2e 20 20 52 65 74 75 72 6e  tabases.  Return
1670: 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49   one of the SQLI
1680: 54 45 5f 20 65 72 72 6f 72 20 63 6f 64 65 73 20  TE_ error codes 
1690: 74 6f 0a 2a 2a 20 69 6e 64 69 63 61 74 65 20 73  to.** indicate s
16a0: 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72  uccess or failur
16b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16c0: 20 73 71 6c 69 74 65 49 6e 69 74 4f 6e 65 28 73   sqliteInitOne(s
16d0: 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 69  qlite *db, int i
16e0: 44 62 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  Db, char **pzErr
16f0: 4d 73 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Msg){.  int rc;.
1700: 20 20 42 74 43 75 72 73 6f 72 20 2a 63 75 72 4d    BtCursor *curM
1710: 61 69 6e 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  ain;.  int size;
1720: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
1730: 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 36 5d    char *azArg[6]
1740: 3b 0a 20 20 63 68 61 72 20 7a 44 62 4e 75 6d 5b  ;.  char zDbNum[
1750: 33 30 5d 3b 0a 20 20 69 6e 74 20 6d 65 74 61 5b  30];.  int meta[
1760: 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f 4d  SQLITE_N_BTREE_M
1770: 45 54 41 5d 3b 0a 20 20 50 61 72 73 65 20 73 50  ETA];.  Parse sP
1780: 61 72 73 65 3b 0a 20 20 49 6e 69 74 44 61 74 61  arse;.  InitData
1790: 20 69 6e 69 74 44 61 74 61 3b 0a 0a 20 20 2f 2a   initData;..  /*
17a0: 0a 20 20 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  .  ** The master
17b0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
17c0: 68 61 73 20 61 20 73 74 72 75 63 74 75 72 65 20  has a structure 
17d0: 6c 69 6b 65 20 74 68 69 73 0a 20 20 2a 2f 0a 20  like this.  */. 
17e0: 20 73 74 61 74 69 63 20 63 68 61 72 20 6d 61 73   static char mas
17f0: 74 65 72 5f 73 63 68 65 6d 61 5b 5d 20 3d 20 0a  ter_schema[] = .
1800: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
1810: 4c 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  LE sqlite_master
1820: 28 5c 6e 22 0a 20 20 20 20 20 22 20 20 74 79 70  (\n".     "  typ
1830: 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
1840: 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22  "  name text,\n"
1850: 0a 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d  .     "  tbl_nam
1860: 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
1870: 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65  "  rootpage inte
1880: 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20  ger,\n".     "  
1890: 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
18a0: 20 22 29 22 0a 20 20 3b 0a 20 20 73 74 61 74 69   ")".  ;.  stati
18b0: 63 20 63 68 61 72 20 74 65 6d 70 5f 6d 61 73 74  c char temp_mast
18c0: 65 72 5f 73 63 68 65 6d 61 5b 5d 20 3d 20 0a 20  er_schema[] = . 
18d0: 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50      "CREATE TEMP
18e0: 20 54 41 42 4c 45 20 73 71 6c 69 74 65 5f 74 65   TABLE sqlite_te
18f0: 6d 70 5f 6d 61 73 74 65 72 28 5c 6e 22 0a 20 20  mp_master(\n".  
1900: 20 20 20 22 20 20 74 79 70 65 20 74 65 78 74 2c     "  type text,
1910: 5c 6e 22 0a 20 20 20 20 20 22 20 20 6e 61 6d 65  \n".     "  name
1920: 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 22   text,\n".     "
1930: 20 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c    tbl_name text,
1940: 5c 6e 22 0a 20 20 20 20 20 22 20 20 72 6f 6f 74  \n".     "  root
1950: 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22  page integer,\n"
1960: 0a 20 20 20 20 20 22 20 20 73 71 6c 20 74 65 78  .     "  sql tex
1970: 74 5c 6e 22 0a 20 20 20 20 20 22 29 22 0a 20 20  t\n".     ")".  
1980: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1990: 6f 77 69 6e 67 20 53 51 4c 20 77 69 6c 6c 20 72  owing SQL will r
19a0: 65 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 66  ead the schema f
19b0: 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
19c0: 61 62 6c 65 73 2e 0a 20 20 2a 2a 20 54 68 65 20  ables..  ** The 
19d0: 66 69 72 73 74 20 76 65 72 73 69 6f 6e 20 77 6f  first version wo
19e0: 72 6b 73 20 77 69 74 68 20 53 51 4c 69 74 65 20  rks with SQLite 
19f0: 66 69 6c 65 20 66 6f 72 6d 61 74 73 20 32 20 6f  file formats 2 o
1a00: 72 20 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20  r greater..  ** 
1a10: 54 68 65 20 73 65 63 6f 6e 64 20 76 65 72 73 69  The second versi
1a20: 6f 6e 20 69 73 20 66 6f 72 20 66 6f 72 6d 61 74  on is for format
1a30: 20 31 20 66 69 6c 65 73 2e 0a 20 20 2a 2a 0a 20   1 files..  **. 
1a40: 20 2a 2a 20 42 65 67 69 6e 6e 69 6e 67 20 77 69   ** Beginning wi
1a50: 74 68 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 32  th file format 2
1a60: 2c 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  , the rowid for 
1a70: 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 69 65  new table entrie
1a80: 73 0a 20 20 2a 2a 20 28 69 6e 63 6c 75 64 69 6e  s.  ** (includin
1a90: 67 20 65 6e 74 72 69 65 73 20 69 6e 20 73 71 6c  g entries in sql
1aa0: 69 74 65 5f 6d 61 73 74 65 72 29 20 69 73 20 61  ite_master) is a
1ab0: 6e 20 69 6e 63 72 65 61 73 69 6e 67 20 69 6e 74  n increasing int
1ac0: 65 67 65 72 2e 0a 20 20 2a 2a 20 53 6f 20 66 6f  eger..  ** So fo
1ad0: 72 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 32 20  r file format 2 
1ae0: 61 6e 64 20 6c 61 74 65 72 2c 20 77 65 20 63 61  and later, we ca
1af0: 6e 20 70 6c 61 79 20 62 61 63 6b 20 73 71 6c 69  n play back sqli
1b00: 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 61  te_master.  ** a
1b10: 6e 64 20 61 6c 6c 20 74 68 65 20 43 52 45 41 54  nd all the CREAT
1b20: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c  E statements wil
1b30: 6c 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  l appear in the 
1b40: 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 20 20 2a  right order..  *
1b50: 2a 20 42 75 74 20 77 69 74 68 20 66 69 6c 65 20  * But with file 
1b60: 66 6f 72 6d 61 74 20 31 2c 20 74 61 62 6c 65 20  format 1, table 
1b70: 65 6e 74 72 69 65 73 20 77 65 72 65 20 72 61 6e  entries were ran
1b80: 64 6f 6d 20 61 6e 64 20 73 6f 20 77 65 0a 20 20  dom and so we.  
1b90: 2a 2a 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  ** have to make 
1ba0: 73 75 72 65 20 74 68 65 20 43 52 45 41 54 45 20  sure the CREATE 
1bb0: 54 41 42 4c 45 73 20 6f 63 63 75 72 20 62 65 66  TABLEs occur bef
1bc0: 6f 72 65 20 74 68 65 69 72 20 63 6f 72 72 65 73  ore their corres
1bd0: 70 6f 6e 64 69 6e 67 0a 20 20 2a 2a 20 43 52 45  ponding.  ** CRE
1be0: 41 54 45 20 49 4e 44 45 58 73 2e 20 20 28 57 65  ATE INDEXs.  (We
1bf0: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 64   don't have to d
1c00: 65 61 6c 20 77 69 74 68 20 43 52 45 41 54 45 20  eal with CREATE 
1c10: 56 49 45 57 20 6f 72 0a 20 20 2a 2a 20 43 52 45  VIEW or.  ** CRE
1c20: 41 54 45 20 54 52 49 47 47 45 52 20 69 6e 20 66  ATE TRIGGER in f
1c30: 69 6c 65 20 66 6f 72 6d 61 74 20 31 20 62 65 63  ile format 1 bec
1c40: 61 75 73 65 20 74 68 6f 73 65 20 63 6f 6e 73 74  ause those const
1c50: 72 75 63 74 73 20 64 69 64 0a 20 20 2a 2a 20 6e  ructs did.  ** n
1c60: 6f 74 20 65 78 69 73 74 20 74 68 65 6e 2e 29 20  ot exist then.) 
1c70: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  .  */.  static c
1c80: 68 61 72 20 69 6e 69 74 5f 73 63 72 69 70 74 5b  har init_script[
1c90: 5d 20 3d 20 0a 20 20 20 20 20 22 53 45 4c 45 43  ] = .     "SELEC
1ca0: 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 72 6f  T type, name, ro
1cb0: 6f 74 70 61 67 65 2c 20 73 71 6c 2c 20 31 20 46  otpage, sql, 1 F
1cc0: 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ROM sqlite_temp_
1cd0: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 22 55  master ".     "U
1ce0: 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20  NION ALL ".     
1cf0: 22 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61  "SELECT type, na
1d00: 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71  me, rootpage, sq
1d10: 6c 2c 20 30 20 46 52 4f 4d 20 73 71 6c 69 74 65  l, 0 FROM sqlite
1d20: 5f 6d 61 73 74 65 72 22 3b 0a 20 20 73 74 61 74  _master";.  stat
1d30: 69 63 20 63 68 61 72 20 6f 6c 64 65 72 5f 69 6e  ic char older_in
1d40: 69 74 5f 73 63 72 69 70 74 5b 5d 20 3d 20 0a 20  it_script[] = . 
1d50: 20 20 20 20 22 53 45 4c 45 43 54 20 74 79 70 65      "SELECT type
1d60: 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  , name, rootpage
1d70: 2c 20 73 71 6c 2c 20 31 20 46 52 4f 4d 20 73 71  , sql, 1 FROM sq
1d80: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
1d90: 20 22 0a 20 20 20 20 20 22 55 4e 49 4f 4e 20 41   ".     "UNION A
1da0: 4c 4c 20 22 0a 20 20 20 20 20 22 53 45 4c 45 43  LL ".     "SELEC
1db0: 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 72 6f  T type, name, ro
1dc0: 6f 74 70 61 67 65 2c 20 73 71 6c 2c 20 30 20 46  otpage, sql, 0 F
1dd0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1de0: 72 20 22 0a 20 20 20 20 20 22 57 48 45 52 45 20  r ".     "WHERE 
1df0: 74 79 70 65 3d 27 74 61 62 6c 65 27 20 22 0a 20  type='table' ". 
1e00: 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c 20 22      "UNION ALL "
1e10: 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 79  .     "SELECT ty
1e20: 70 65 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74 70 61  pe, name, rootpa
1e30: 67 65 2c 20 73 71 6c 2c 20 30 20 46 52 4f 4d 20  ge, sql, 0 FROM 
1e40: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
1e50: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
1e60: 3d 27 69 6e 64 65 78 27 22 3b 0a 0a 0a 20 20 61  ='index'";...  a
1e70: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
1e80: 20 69 44 62 21 3d 31 20 26 26 20 69 44 62 3c 64   iDb!=1 && iDb<d
1e90: 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
1ea0: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 73 63  Construct the sc
1eb0: 68 65 6d 61 20 74 61 62 6c 65 73 3a 20 73 71 6c  hema tables: sql
1ec0: 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 20 73  ite_master and s
1ed0: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
1ee0: 72 0a 20 20 2a 2f 0a 20 20 61 7a 41 72 67 5b 30  r.  */.  azArg[0
1ef0: 5d 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 61  ] = "table";.  a
1f00: 7a 41 72 67 5b 31 5d 20 3d 20 4d 41 53 54 45 52  zArg[1] = MASTER
1f10: 5f 4e 41 4d 45 3b 0a 20 20 61 7a 41 72 67 5b 32  _NAME;.  azArg[2
1f20: 5d 20 3d 20 22 32 22 3b 0a 20 20 61 7a 41 72 67  ] = "2";.  azArg
1f30: 5b 33 5d 20 3d 20 6d 61 73 74 65 72 5f 73 63 68  [3] = master_sch
1f40: 65 6d 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ema;.  sprintf(z
1f50: 44 62 4e 75 6d 2c 20 22 25 64 22 2c 20 69 44 62  DbNum, "%d", iDb
1f60: 29 3b 0a 20 20 61 7a 41 72 67 5b 34 5d 20 3d 20  );.  azArg[4] = 
1f70: 7a 44 62 4e 75 6d 3b 0a 20 20 61 7a 41 72 67 5b  zDbNum;.  azArg[
1f80: 35 5d 20 3d 20 30 3b 0a 20 20 69 6e 69 74 44 61  5] = 0;.  initDa
1f90: 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20 69 6e  ta.db = db;.  in
1fa0: 69 74 44 61 74 61 2e 70 7a 45 72 72 4d 73 67 20  itData.pzErrMsg 
1fb0: 3d 20 70 7a 45 72 72 4d 73 67 3b 0a 20 20 73 71  = pzErrMsg;.  sq
1fc0: 6c 69 74 65 49 6e 69 74 43 61 6c 6c 62 61 63 6b  liteInitCallback
1fd0: 28 26 69 6e 69 74 44 61 74 61 2c 20 35 2c 20 61  (&initData, 5, a
1fe0: 7a 41 72 67 2c 20 30 29 3b 0a 20 20 70 54 61 62  zArg, 0);.  pTab
1ff0: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
2000: 6c 65 28 64 62 2c 20 4d 41 53 54 45 52 5f 4e 41  le(db, MASTER_NA
2010: 4d 45 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 69  ME, "main");.  i
2020: 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 70  f( pTab ){.    p
2030: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  Tab->readOnly = 
2040: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  1;.  }.  if( iDb
2050: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 7a 41 72 67  ==0 ){.    azArg
2060: 5b 31 5d 20 3d 20 54 45 4d 50 5f 4d 41 53 54 45  [1] = TEMP_MASTE
2070: 52 5f 4e 41 4d 45 3b 0a 20 20 20 20 61 7a 41 72  R_NAME;.    azAr
2080: 67 5b 33 5d 20 3d 20 74 65 6d 70 5f 6d 61 73 74  g[3] = temp_mast
2090: 65 72 5f 73 63 68 65 6d 61 3b 0a 20 20 20 20 61  er_schema;.    a
20a0: 7a 41 72 67 5b 34 5d 20 3d 20 22 31 22 3b 0a 20  zArg[4] = "1";. 
20b0: 20 20 20 73 71 6c 69 74 65 49 6e 69 74 43 61 6c     sqliteInitCal
20c0: 6c 62 61 63 6b 28 26 69 6e 69 74 44 61 74 61 2c  lback(&initData,
20d0: 20 35 2c 20 61 7a 41 72 67 2c 20 30 29 3b 0a 20   5, azArg, 0);. 
20e0: 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
20f0: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 54 45  FindTable(db, TE
2100: 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  MP_MASTER_NAME, 
2110: 22 74 65 6d 70 22 29 3b 0a 20 20 20 20 69 66 28  "temp");.    if(
2120: 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70   pTab ){.      p
2130: 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  Tab->readOnly = 
2140: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
2150: 2f 2a 20 43 72 65 61 74 65 20 61 20 63 75 72 73  /* Create a curs
2160: 6f 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 64  or to hold the d
2170: 61 74 61 62 61 73 65 20 6f 70 65 6e 0a 20 20 2a  atabase open.  *
2180: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /.  if( db->aDb[
2190: 69 44 62 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  iDb].pBt==0 ) re
21a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72    rc = sqliteBtr
21c0: 65 65 43 75 72 73 6f 72 28 64 62 2d 3e 61 44 62  eeCursor(db->aDb
21d0: 5b 69 44 62 5d 2e 70 42 74 2c 20 32 2c 20 30 2c  [iDb].pBt, 2, 0,
21e0: 20 26 63 75 72 4d 61 69 6e 29 3b 0a 20 20 69 66   &curMain);.  if
21f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
2200: 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  teSetString(pzEr
2210: 72 4d 73 67 2c 20 73 71 6c 69 74 65 5f 65 72 72  rMsg, sqlite_err
2220: 6f 72 5f 73 74 72 69 6e 67 28 72 63 29 2c 20 30  or_string(rc), 0
2230: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2240: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
2250: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 65 74  the database met
2260: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20  a information.  
2270: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2280: 42 74 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d  BtreeGetMeta(db-
2290: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 2c 20 6d  >aDb[iDb].pBt, m
22a0: 65 74 61 29 3b 0a 20 20 69 66 28 20 72 63 20 29  eta);.  if( rc )
22b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
22c0: 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20  tring(pzErrMsg, 
22d0: 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74 72  sqlite_error_str
22e0: 69 6e 67 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ing(rc), 0);.   
22f0: 20 73 71 6c 69 74 65 42 74 72 65 65 43 6c 6f 73   sqliteBtreeClos
2300: 65 43 75 72 73 6f 72 28 63 75 72 4d 61 69 6e 29  eCursor(curMain)
2310: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2320: 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 69  .  }.  db->aDb[i
2330: 44 62 5d 2e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  Db].schema_cooki
2340: 65 20 3d 20 6d 65 74 61 5b 31 5d 3b 0a 20 20 69  e = meta[1];.  i
2350: 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20  f( iDb==0 ){.   
2360: 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b 69 65   db->next_cookie
2370: 20 3d 20 6d 65 74 61 5b 31 5d 3b 0a 20 20 20 20   = meta[1];.    
2380: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20  db->file_format 
2390: 3d 20 6d 65 74 61 5b 32 5d 3b 0a 20 20 20 20 73  = meta[2];.    s
23a0: 69 7a 65 20 3d 20 6d 65 74 61 5b 33 5d 3b 0a 20  ize = meta[3];. 
23b0: 20 20 20 69 66 28 20 73 69 7a 65 3d 3d 30 20 29     if( size==0 )
23c0: 7b 20 73 69 7a 65 20 3d 20 4d 41 58 5f 50 41 47  { size = MAX_PAG
23d0: 45 53 3b 20 7d 0a 20 20 20 20 64 62 2d 3e 63 61  ES; }.    db->ca
23e0: 63 68 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 3b  che_size = size;
23f0: 0a 20 20 20 20 64 62 2d 3e 73 61 66 65 74 79 5f  .    db->safety_
2400: 6c 65 76 65 6c 20 3d 20 6d 65 74 61 5b 34 5d 3b  level = meta[4];
2410: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 73 61 66  .    if( db->saf
2420: 65 74 79 5f 6c 65 76 65 6c 3d 3d 30 20 29 20 64  ety_level==0 ) d
2430: 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
2440: 3d 20 32 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  = 2;..    /*.   
2450: 20 2a 2a 20 20 66 69 6c 65 5f 66 6f 72 6d 61 74   **  file_format
2460: 3d 3d 31 20 20 20 20 56 65 72 73 69 6f 6e 20 32  ==1    Version 2
2470: 2e 31 2e 30 2e 0a 20 20 20 20 2a 2a 20 20 66 69  .1.0..    **  fi
2480: 6c 65 5f 66 6f 72 6d 61 74 3d 3d 32 20 20 20 20  le_format==2    
2490: 56 65 72 73 69 6f 6e 20 32 2e 32 2e 30 2e 20 41  Version 2.2.0. A
24a0: 64 64 20 73 75 70 70 6f 72 74 20 66 6f 72 20 49  dd support for I
24b0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
24c0: 45 59 2e 0a 20 20 20 20 2a 2a 20 20 66 69 6c 65  EY..    **  file
24d0: 5f 66 6f 72 6d 61 74 3d 3d 33 20 20 20 20 56 65  _format==3    Ve
24e0: 72 73 69 6f 6e 20 32 2e 36 2e 30 2e 20 46 69 78  rsion 2.6.0. Fix
24f0: 20 65 6d 70 74 79 2d 73 74 72 69 6e 67 20 69 6e   empty-string in
2500: 64 65 78 20 62 75 67 2e 0a 20 20 20 20 2a 2a 20  dex bug..    ** 
2510: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 34 20   file_format==4 
2520: 20 20 20 56 65 72 73 69 6f 6e 20 32 2e 37 2e 30     Version 2.7.0
2530: 2e 20 41 64 64 20 73 75 70 70 6f 72 74 20 66 6f  . Add support fo
2540: 72 20 73 65 70 61 72 61 74 65 20 6e 75 6d 65 72  r separate numer
2550: 69 63 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  ic and.    **   
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 74 65 78 74 20 64 61 74 61 74 79 70 65 73 2e   text datatypes.
2580: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2590: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3d  db->file_format=
25a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
25b0: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 74  his happens if t
25c0: 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
25d0: 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 20  initially empty 
25e0: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 66 69 6c  */.      db->fil
25f0: 65 5f 66 6f 72 6d 61 74 20 3d 20 34 3b 0a 20 20  e_format = 4;.  
2600: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
2610: 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 34 20 29 7b  file_format>4 ){
2620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72  .      sqliteBtr
2630: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 63 75  eeCloseCursor(cu
2640: 72 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 73 71  rMain);.      sq
2650: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a  liteSetString(pz
2660: 45 72 72 4d 73 67 2c 20 22 75 6e 73 75 70 70 6f  ErrMsg, "unsuppo
2670: 72 74 65 64 20 66 69 6c 65 20 66 6f 72 6d 61 74  rted file format
2680: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
2690: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
26a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
26b0: 69 66 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72  if( db->file_for
26c0: 6d 61 74 21 3d 6d 65 74 61 5b 32 5d 20 7c 7c 20  mat!=meta[2] || 
26d0: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3c  db->file_format<
26e0: 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  4 ){.    assert(
26f0: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
2700: 3e 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6d  >=4 );.    if( m
2710: 65 74 61 5b 32 5d 3d 3d 30 20 29 7b 0a 20 20 20  eta[2]==0 ){.   
2720: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
2730: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 63 61  ng(pzErrMsg, "ca
2740: 6e 6e 6f 74 20 61 74 74 61 63 68 20 65 6d 70 74  nnot attach empt
2750: 79 20 64 61 74 61 62 61 73 65 3a 20 22 2c 0a 20  y database: ",. 
2760: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
2770: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  iDb].zName, 0);.
2780: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2790: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
27a0: 28 70 7a 45 72 72 4d 73 67 2c 20 22 69 6e 63 6f  (pzErrMsg, "inco
27b0: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
27c0: 72 6d 61 74 20 69 6e 20 61 75 78 69 6c 69 61 72  rmat in auxiliar
27d0: 79 20 22 0a 20 20 20 20 20 20 20 20 20 22 64 61  y ".         "da
27e0: 74 61 62 61 73 65 3a 20 22 2c 20 64 62 2d 3e 61  tabase: ", db->a
27f0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 30  Db[iDb].zName, 0
2800: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2810: 69 74 65 42 74 72 65 65 43 6c 6f 73 65 28 64 62  iteBtreeClose(db
2820: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 3b  ->aDb[iDb].pBt);
2830: 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62  .    db->aDb[iDb
2840: 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 72  ].pBt = 0;.    r
2850: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 4f 52  eturn SQLITE_FOR
2860: 4d 41 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  MAT;.  }.  sqlit
2870: 65 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  eBtreeSetCacheSi
2880: 7a 65 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ze(db->aDb[iDb].
2890: 70 42 74 2c 20 73 69 7a 65 29 3b 0a 20 20 73 71  pBt, size);.  sq
28a0: 6c 69 74 65 42 74 72 65 65 53 65 74 53 61 66 65  liteBtreeSetSafe
28b0: 74 79 4c 65 76 65 6c 28 64 62 2d 3e 61 44 62 5b  tyLevel(db->aDb[
28c0: 69 44 62 5d 2e 70 42 74 2c 20 6d 65 74 61 5b 34  iDb].pBt, meta[4
28d0: 5d 3d 3d 30 20 3f 20 32 20 3a 20 6d 65 74 61 5b  ]==0 ? 2 : meta[
28e0: 34 5d 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  4]);..  /* Read 
28f0: 74 68 65 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  the schema infor
2900: 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 74 68  mation out of th
2910: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 0a  e schema tables.
2920: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73    */.  memset(&s
2930: 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Parse, 0, sizeof
2940: 28 73 50 61 72 73 65 29 29 3b 0a 20 20 73 50 61  (sParse));.  sPa
2950: 72 73 65 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73  rse.db = db;.  s
2960: 50 61 72 73 65 2e 78 43 61 6c 6c 62 61 63 6b 20  Parse.xCallback 
2970: 3d 20 73 71 6c 69 74 65 49 6e 69 74 43 61 6c 6c  = sqliteInitCall
2980: 62 61 63 6b 3b 0a 20 20 73 50 61 72 73 65 2e 70  back;.  sParse.p
2990: 41 72 67 20 3d 20 28 76 6f 69 64 2a 29 26 69 6e  Arg = (void*)&in
29a0: 69 74 44 61 74 61 3b 0a 20 20 73 50 61 72 73 65  itData;.  sParse
29b0: 2e 69 6e 69 74 46 6c 61 67 20 3d 20 31 3b 0a 20  .initFlag = 1;. 
29c0: 20 73 50 61 72 73 65 2e 75 73 65 43 61 6c 6c 62   sParse.useCallb
29d0: 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 69  ack = 1;.  if( i
29e0: 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  Db==0 ){.    sql
29f0: 69 74 65 52 75 6e 50 61 72 73 65 72 28 26 73 50  iteRunParser(&sP
2a00: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 64 62  arse,.        db
2a10: 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 32  ->file_format>=2
2a20: 20 3f 20 69 6e 69 74 5f 73 63 72 69 70 74 20 3a   ? init_script :
2a30: 20 6f 6c 64 65 72 5f 69 6e 69 74 5f 73 63 72 69   older_init_scri
2a40: 70 74 2c 0a 20 20 20 20 20 20 20 20 70 7a 45 72  pt,.        pzEr
2a50: 72 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rMsg);.  }else{.
2a60: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
2a70: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   0;.    sqliteSe
2a80: 74 53 74 72 69 6e 67 28 26 7a 53 71 6c 2c 20 0a  tString(&zSql, .
2a90: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74         "SELECT t
2aa0: 79 70 65 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74 70  ype, name, rootp
2ab0: 61 67 65 2c 20 73 71 6c 2c 20 22 2c 20 7a 44 62  age, sql, ", zDb
2ac0: 4e 75 6d 2c 20 22 20 46 52 4f 4d 20 5c 22 22 2c  Num, " FROM \"",
2ad0: 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
2ae0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 22 5c 22 2e  iDb].zName, "\".
2af0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20  sqlite_master", 
2b00: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 52 75  0);.    sqliteRu
2b10: 6e 50 61 72 73 65 72 28 26 73 50 61 72 73 65 2c  nParser(&sParse,
2b20: 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d 73 67 29   zSql, pzErrMsg)
2b30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
2b40: 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  (zSql);.  }.  sq
2b50: 6c 69 74 65 42 74 72 65 65 43 6c 6f 73 65 43 75  liteBtreeCloseCu
2b60: 72 73 6f 72 28 63 75 72 4d 61 69 6e 29 3b 0a 20  rsor(curMain);. 
2b70: 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c   if( sqlite_mall
2b80: 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  oc_failed ){.   
2b90: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
2ba0: 28 70 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74 20  (pzErrMsg, "out 
2bb0: 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a  of memory", 0);.
2bc0: 20 20 20 20 73 50 61 72 73 65 2e 72 63 20 3d 20      sParse.rc = 
2bd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2be0: 20 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74    sqliteResetInt
2bf0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
2c00: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 50  0);.  }.  if( sP
2c10: 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f  arse.rc==SQLITE_
2c20: 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 44  OK ){.    db->aD
2c30: 62 5b 69 44 62 5d 2e 66 6c 61 67 73 20 7c 3d 20  b[iDb].flags |= 
2c40: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
2c50: 65 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ed;.  }else{.   
2c60: 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65   sqliteResetInte
2c70: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 69  rnalSchema(db, i
2c80: 44 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Db);.  }.  retur
2c90: 6e 20 73 50 61 72 73 65 2e 72 63 3b 0a 7d 0a 0a  n sParse.rc;.}..
2ca0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2cb0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
2cc0: 6c 65 73 20 2d 20 74 68 65 20 6d 61 69 6e 20 64  les - the main d
2cd0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
2ce0: 65 20 66 69 6c 65 0a 2a 2a 20 75 73 65 64 20 74  e file.** used t
2cf0: 6f 20 73 74 6f 72 65 20 74 65 6d 70 6f 72 61 72  o store temporar
2d00: 79 20 74 61 62 6c 65 73 2c 20 61 6e 64 20 61 6e  y tables, and an
2d10: 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 64 61 74  y additional dat
2d20: 61 62 61 73 65 20 66 69 6c 65 73 0a 2a 2a 20 63  abase files.** c
2d30: 72 65 61 74 65 64 20 75 73 69 6e 67 20 41 54 54  reated using ATT
2d40: 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ACH statements. 
2d50: 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2d60: 73 20 63 6f 64 65 2e 20 20 49 66 20 61 6e 0a 2a  s code.  If an.*
2d70: 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
2d80: 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  write an error m
2d90: 65 73 73 61 67 65 20 69 6e 74 6f 20 2a 70 7a 45  essage into *pzE
2da0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  rrMsg..**.** Aft
2db0: 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  er the database 
2dc0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  is initialized, 
2dd0: 74 68 65 20 53 51 4c 49 54 45 5f 49 6e 69 74 69  the SQLITE_Initi
2de0: 61 6c 69 7a 65 64 0a 2a 2a 20 62 69 74 20 69 73  alized.** bit is
2df0: 20 73 65 74 20 69 6e 20 74 68 65 20 66 6c 61 67   set in the flag
2e00: 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  s field of the s
2e10: 71 6c 69 74 65 20 73 74 72 75 63 74 75 72 65 2e  qlite structure.
2e20: 20 20 41 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20    An.** attempt 
2e30: 69 73 20 6d 61 64 65 20 74 6f 20 69 6e 69 74 69  is made to initi
2e40: 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  alize the databa
2e50: 73 65 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74  se as soon as it
2e60: 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 2e 20 20  .** is opened.  
2e70: 49 66 20 74 68 61 74 20 66 61 69 6c 73 20 28 70  If that fails (p
2e80: 65 72 68 61 70 73 20 62 65 63 61 75 73 65 20 61  erhaps because a
2e90: 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 2a  nother process.*
2ea0: 2a 20 68 61 73 20 74 68 65 20 73 71 6c 69 74 65  * has the sqlite
2eb0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6c 6f  _master table lo
2ec0: 63 6b 65 64 29 20 74 68 61 6e 20 61 6e 6f 74 68  cked) than anoth
2ed0: 65 72 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  er attempt.** is
2ee0: 20 6d 61 64 65 20 74 68 65 20 66 69 72 73 74 20   made the first 
2ef0: 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
2f00: 65 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 2a  e is accessed..*
2f10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 6e 69 74  /.int sqliteInit
2f20: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61  (sqlite *db, cha
2f30: 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20  r **pzErrMsg){. 
2f40: 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 0a 20   int i, rc;.  . 
2f50: 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
2f60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
2f70: 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20 29 3b 0a  tialized)==0 );.
2f80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2f90: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
2fa0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
2fb0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2fc0: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
2fd0: 5d 2e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ].flags & SQLITE
2fe0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 20 29 20 63  _Initialized ) c
2ff0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
3000: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
3010: 3b 20 20 2f 2a 20 53 6b 69 70 20 74 68 65 20 74  ;  /* Skip the t
3020: 65 6d 70 20 64 61 74 61 62 61 73 65 20 2d 20 69  emp database - i
3030: 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74 68 20  nitialized with 
3040: 30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  0 */.    rc = sq
3050: 6c 69 74 65 49 6e 69 74 4f 6e 65 28 64 62 2c 20  liteInitOne(db, 
3060: 69 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  i, pzErrMsg);.  
3070: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
3080: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
3090: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
30a0: 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20  _Initialized;.  
30b0: 20 20 73 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e    sqliteCommitIn
30c0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
30d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30e0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
30f0: 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64  LITE_Initialized
3100: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
3110: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
3120: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6c  version of the l
3130: 69 62 72 61 72 79 0a 2a 2f 0a 63 6f 6e 73 74 20  ibrary.*/.const 
3140: 63 68 61 72 20 72 63 73 69 64 5b 5d 20 3d 20 22  char rcsid[] = "
3150: 40 28 23 29 20 5c 30 34 34 49 64 3a 20 53 51 4c  @(#) \044Id: SQL
3160: 69 74 65 20 76 65 72 73 69 6f 6e 20 22 20 53 51  ite version " SQ
3170: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 20 22 20 24  LITE_VERSION " $
3180: 22 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 73 71  ";.const char sq
3190: 6c 69 74 65 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d  lite_version[] =
31a0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 3b   SQLITE_VERSION;
31b0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 65 73 20 74 68 65  ../*.** Does the
31c0: 20 6c 69 62 72 61 72 79 20 65 78 70 65 63 74 20   library expect 
31d0: 64 61 74 61 20 74 6f 20 62 65 20 65 6e 63 6f 64  data to be encod
31e0: 65 64 20 61 73 20 55 54 46 2d 38 20 6f 72 20 69  ed as UTF-8 or i
31f0: 73 6f 38 38 35 39 3f 20 20 54 68 65 0a 2a 2a 20  so8859?  The.** 
3200: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
3210: 20 63 6f 6e 73 74 61 6e 74 20 61 6c 77 61 79 73   constant always
3220: 20 6c 65 74 73 20 75 73 20 6b 6e 6f 77 2e 0a 2a   lets us know..*
3230: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3240: 55 54 46 38 0a 63 6f 6e 73 74 20 63 68 61 72 20  UTF8.const char 
3250: 73 71 6c 69 74 65 5f 65 6e 63 6f 64 69 6e 67 5b  sqlite_encoding[
3260: 5d 20 3d 20 22 55 54 46 2d 38 22 3b 0a 23 65 6c  ] = "UTF-8";.#el
3270: 73 65 0a 63 6f 6e 73 74 20 63 68 61 72 20 73 71  se.const char sq
3280: 6c 69 74 65 5f 65 6e 63 6f 64 69 6e 67 5b 5d 20  lite_encoding[] 
3290: 3d 20 22 69 73 6f 38 38 35 39 22 3b 0a 23 65 6e  = "iso8859";.#en
32a0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
32b0: 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74  a new SQLite dat
32c0: 61 62 61 73 65 2e 20 20 43 6f 6e 73 74 72 75 63  abase.  Construc
32d0: 74 20 61 6e 20 22 73 71 6c 69 74 65 22 20 73 74  t an "sqlite" st
32e0: 72 75 63 74 75 72 65 20 74 6f 20 64 65 66 69 6e  ructure to defin
32f0: 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f  e.** the state o
3300: 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
3310: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
3320: 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74 72  nter to that str
3330: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  ucture..**.** An
3340: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
3350: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
3360: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
3370: 61 20 73 74 72 75 63 74 75 72 65 73 20 74 68 61  a structures tha
3380: 74 0a 2a 2a 20 68 6f 6c 64 20 74 68 65 20 64 61  t.** hold the da
3390: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 20  tabase schema.  
33a0: 42 75 74 20 69 66 20 74 68 69 73 20 66 61 69 6c  But if this fail
33b0: 73 20 28 62 65 63 61 75 73 65 20 74 68 65 20 73  s (because the s
33c0: 63 68 65 6d 61 20 66 69 6c 65 0a 2a 2a 20 69 73  chema file.** is
33d0: 20 6c 6f 63 6b 65 64 29 20 74 68 65 6e 20 74 68   locked) then th
33e0: 61 74 20 73 74 65 70 20 69 73 20 64 65 66 65 72  at step is defer
33f0: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  red until the fi
3400: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73  rst call to.** s
3410: 71 6c 69 74 65 5f 65 78 65 63 28 29 2e 0a 2a 2f  qlite_exec()..*/
3420: 0a 73 71 6c 69 74 65 20 2a 73 71 6c 69 74 65 5f  .sqlite *sqlite_
3430: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
3440: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
3450: 6d 6f 64 65 2c 20 63 68 61 72 20 2a 2a 70 7a 45  mode, char **pzE
3460: 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c 69 74 65  rrMsg){.  sqlite
3470: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 2c 20   *db;.  int rc, 
3480: 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  i;..  /* Allocat
3490: 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  e the sqlite dat
34a0: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
34b0: 20 64 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c   db = sqliteMall
34c0: 6f 63 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  oc( sizeof(sqlit
34d0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 7a 45 72  e) );.  if( pzEr
34e0: 72 4d 73 67 20 29 20 2a 70 7a 45 72 72 4d 73 67  rMsg ) *pzErrMsg
34f0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 3d 3d   = 0;.  if( db==
3500: 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 5f  0 ) goto no_mem_
3510: 6f 6e 5f 6f 70 65 6e 3b 0a 20 20 64 62 2d 3e 6f  on_open;.  db->o
3520: 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 44 65 66 61  nError = OE_Defa
3530: 75 6c 74 3b 0a 20 20 64 62 2d 3e 70 72 69 6f 72  ult;.  db->prior
3540: 4e 65 77 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  NewRowid = 0;.  
3550: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
3560: 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
3570: 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20   db->nDb = 2;.  
3580: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
3590: 62 53 74 61 74 69 63 3b 0a 20 20 73 71 6c 69 74  bStatic;.  sqlit
35a0: 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  eHashInit(&db->a
35b0: 46 75 6e 63 2c 20 53 51 4c 49 54 45 5f 48 41 53  Func, SQLITE_HAS
35c0: 48 5f 53 54 52 49 4e 47 2c 20 31 29 3b 0a 20 20  H_STRING, 1);.  
35d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
35e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Db; i++){.    sq
35f0: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62  liteHashInit(&db
3600: 2d 3e 61 44 62 5b 69 5d 2e 74 62 6c 48 61 73 68  ->aDb[i].tblHash
3610: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
3620: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
3630: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62  liteHashInit(&db
3640: 2d 3e 61 44 62 5b 69 5d 2e 69 64 78 48 61 73 68  ->aDb[i].idxHash
3650: 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54  , SQLITE_HASH_ST
3660: 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73 71  RING, 0);.    sq
3670: 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62  liteHashInit(&db
3680: 2d 3e 61 44 62 5b 69 5d 2e 74 72 69 67 48 61 73  ->aDb[i].trigHas
3690: 68 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  h, SQLITE_HASH_S
36a0: 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20 20 20 73  TRING, 0);.    s
36b0: 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26 64  qliteHashInit(&d
36c0: 62 2d 3e 61 44 62 5b 69 5d 2e 61 46 4b 65 79 2c  b->aDb[i].aFKey,
36d0: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
36e0: 49 4e 47 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 0a  ING, 1);.  }.  .
36f0: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61    /* Open the ba
3700: 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64  ckend database d
3710: 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20  river */.  rc = 
3720: 73 71 6c 69 74 65 42 74 72 65 65 4f 70 65 6e 28  sqliteBtreeOpen(
3730: 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 4d 41  zFilename, 0, MA
3740: 58 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 61 44  X_PAGES, &db->aD
3750: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28  b[0].pBt);.  if(
3760: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3770: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
3780: 20 29 7b 0a 20 20 20 20 20 20 64 65 66 61 75 6c   ){.      defaul
3790: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t: {.        sql
37a0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45  iteSetString(pzE
37b0: 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20 74  rrMsg, "unable t
37c0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 3a  o open database:
37d0: 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30   ", zFilename, 0
37e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37f0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
3800: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  db);.    sqliteS
3810: 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d  trRealloc(pzErrM
3820: 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  sg);.    return 
3830: 30 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62  0;.  }.  db->aDb
3840: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69  [0].zName = "mai
3850: 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  n";.  db->aDb[1]
3860: 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  .zName = "temp";
3870: 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
3880: 6f 20 72 65 61 64 20 74 68 65 20 73 63 68 65 6d  o read the schem
3890: 61 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52 65 67  a */.  sqliteReg
38a0: 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63  isterBuiltinFunc
38b0: 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20  tions(db);.  rc 
38c0: 3d 20 73 71 6c 69 74 65 49 6e 69 74 28 64 62 2c  = sqliteInit(db,
38d0: 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 64 62   pzErrMsg);.  db
38e0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
38f0: 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69  _MAGIC_OPEN;.  i
3900: 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  f( sqlite_malloc
3910: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  _failed ){.    s
3920: 71 6c 69 74 65 5f 63 6c 6f 73 65 28 64 62 29 3b  qlite_close(db);
3930: 0a 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  .    goto no_mem
3940: 5f 6f 6e 5f 6f 70 65 6e 3b 0a 20 20 7d 65 6c 73  _on_open;.  }els
3950: 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
3960: 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
3970: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 73 71  E_BUSY ){.    sq
3980: 6c 69 74 65 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  lite_close(db);.
3990: 20 20 20 20 73 71 6c 69 74 65 53 74 72 52 65 61      sqliteStrRea
39a0: 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a  lloc(pzErrMsg);.
39b0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
39c0: 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
39d0: 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
39e0: 46 72 65 65 28 2a 70 7a 45 72 72 4d 73 67 29 3b  Free(*pzErrMsg);
39f0: 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
3a00: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
3a10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
3a20: 20 69 6e 20 66 6f 72 6d 61 74 73 20 31 20 6f 72   in formats 1 or
3a30: 20 32 2c 20 74 68 65 6e 20 75 70 67 72 61 64 65   2, then upgrade
3a40: 20 69 74 20 74 6f 0a 20 20 2a 2a 20 76 65 72 73   it to.  ** vers
3a50: 69 6f 6e 20 33 2e 20 20 54 68 69 73 20 77 69 6c  ion 3.  This wil
3a60: 6c 20 72 65 63 6f 6e 73 74 72 75 63 74 20 61 6c  l reconstruct al
3a70: 6c 20 69 6e 64 69 63 65 73 2e 20 20 49 66 20 74  l indices.  If t
3a80: 68 65 0a 20 20 2a 2a 20 75 70 67 72 61 64 65 20  he.  ** upgrade 
3a90: 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
3aa0: 61 73 6f 6e 20 28 65 78 3a 20 6f 75 74 20 6f 66  ason (ex: out of
3ab0: 20 64 69 73 6b 20 73 70 61 63 65 2c 20 64 61 74   disk space, dat
3ac0: 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 72 65  abase.  ** is re
3ad0: 61 64 20 6f 6e 6c 79 2c 20 69 6e 74 65 72 72 75  ad only, interru
3ae0: 70 74 20 72 65 63 65 69 76 65 64 2c 20 65 74 63  pt received, etc
3af0: 2e 29 20 74 68 65 6e 20 72 65 66 75 73 65 20 74  .) then refuse t
3b00: 6f 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  o open..  */.  i
3b10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3b20: 20 26 26 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72   && db->file_for
3b30: 6d 61 74 3c 33 20 29 7b 0a 20 20 20 20 63 68 61  mat<3 ){.    cha
3b40: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  r *zErr = 0;.   
3b50: 20 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61   InitData initDa
3b60: 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 65 74 61  ta;.    int meta
3b70: 5b 53 51 4c 49 54 45 5f 4e 5f 42 54 52 45 45 5f  [SQLITE_N_BTREE_
3b80: 4d 45 54 41 5d 3b 0a 0a 20 20 20 20 69 6e 69 74  META];..    init
3b90: 44 61 74 61 2e 64 62 20 3d 20 64 62 3b 0a 20 20  Data.db = db;.  
3ba0: 20 20 69 6e 69 74 44 61 74 61 2e 70 7a 45 72 72    initData.pzErr
3bb0: 4d 73 67 20 3d 20 26 7a 45 72 72 3b 0a 20 20 20  Msg = &zErr;.   
3bc0: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
3bd0: 20 3d 20 33 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 3;.    rc = s
3be0: 71 6c 69 74 65 5f 65 78 65 63 28 64 62 2c 0a 20  qlite_exec(db,. 
3bf0: 20 20 20 20 20 22 42 45 47 49 4e 3b 20 53 45 4c       "BEGIN; SEL
3c00: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
3c10: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
3c20: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 3b 22  E type='table';"
3c30: 2c 0a 20 20 20 20 20 20 75 70 67 72 61 64 65 5f  ,.      upgrade_
3c40: 33 5f 63 61 6c 6c 62 61 63 6b 2c 0a 20 20 20 20  3_callback,.    
3c50: 20 20 26 69 6e 69 74 44 61 74 61 2c 0a 20 20 20    &initData,.   
3c60: 20 20 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69     &zErr);.    i
3c70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3c80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3c90: 42 74 72 65 65 47 65 74 4d 65 74 61 28 64 62 2d  BtreeGetMeta(db-
3ca0: 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 6d 65 74  >aDb[0].pBt, met
3cb0: 61 29 3b 0a 20 20 20 20 20 20 6d 65 74 61 5b 32  a);.      meta[2
3cc0: 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 73 71 6c  ] = 4;.      sql
3cd0: 69 74 65 42 74 72 65 65 55 70 64 61 74 65 4d 65  iteBtreeUpdateMe
3ce0: 74 61 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ta(db->aDb[0].pB
3cf0: 74 2c 20 6d 65 74 61 29 3b 0a 20 20 20 20 20 20  t, meta);.      
3d00: 73 71 6c 69 74 65 5f 65 78 65 63 28 64 62 2c 20  sqlite_exec(db, 
3d10: 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
3d20: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
3d30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3d40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
3d50: 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73  etString(pzErrMs
3d60: 67 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  g, .        "una
3d70: 62 6c 65 20 74 6f 20 75 70 67 72 61 64 65 20 64  ble to upgrade d
3d80: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 20 76  atabase to the v
3d90: 65 72 73 69 6f 6e 20 32 2e 36 20 66 6f 72 6d 61  ersion 2.6 forma
3da0: 74 22 2c 0a 20 20 20 20 20 20 20 20 7a 45 72 72  t",.        zErr
3db0: 20 3f 20 22 3a 20 22 20 3a 20 30 2c 20 7a 45 72   ? ": " : 0, zEr
3dc0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
3dd0: 69 74 65 5f 66 72 65 65 6d 65 6d 28 7a 45 72 72  ite_freemem(zErr
3de0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  );.      sqliteS
3df0: 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d  trRealloc(pzErrM
3e00: 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
3e10: 65 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  e_close(db);.   
3e20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
3e30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 5f 66 72   }.    sqlite_fr
3e40: 65 65 6d 65 6d 28 7a 45 72 72 29 3b 0a 20 20 7d  eemem(zErr);.  }
3e50: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
3e60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3e70: 65 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61  ewly opened data
3e80: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a  base structure *
3e90: 2f 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a 0a  /.  return db;..
3ea0: 6e 6f 5f 6d 65 6d 5f 6f 6e 5f 6f 70 65 6e 3a 0a  no_mem_on_open:.
3eb0: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
3ec0: 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74  g(pzErrMsg, "out
3ed0: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b   of memory", 0);
3ee0: 0a 20 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c  .  sqliteStrReal
3ef0: 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a 20  loc(pzErrMsg);. 
3f00: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
3f10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
3f20: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
3f30: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
3f40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 6c 61 73  /.int sqlite_las
3f50: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
3f60: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 72 65  qlite *db){.  re
3f70: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
3f80: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  id;.}../*.** Ret
3f90: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
3fa0: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
3fb0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
3fc0: 6c 20 74 6f 20 73 71 6c 69 74 65 5f 65 78 65 63  l to sqlite_exec
3fd0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
3fe0: 65 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  e_changes(sqlite
3ff0: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
4000: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
4010: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
4020: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
4030: 61 74 61 62 61 73 65 0a 2a 2f 0a 76 6f 69 64 20  atabase.*/.void 
4040: 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28 73 71 6c  sqlite_close(sql
4050: 69 74 65 20 2a 64 62 29 7b 0a 20 20 48 61 73 68  ite *db){.  Hash
4060: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 6e 74 20 6a  Elem *i;.  int j
4070: 3b 0a 20 20 64 62 2d 3e 77 61 6e 74 5f 74 6f 5f  ;.  db->want_to_
4080: 63 6c 6f 73 65 20 3d 20 31 3b 0a 20 20 69 66 28  close = 1;.  if(
4090: 20 73 71 6c 69 74 65 53 61 66 65 74 79 43 68 65   sqliteSafetyChe
40a0: 63 6b 28 64 62 29 20 7c 7c 20 73 71 6c 69 74 65  ck(db) || sqlite
40b0: 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29 7b 0a  SafetyOn(db) ){.
40c0: 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 44      /* printf("D
40d0: 49 44 20 4e 4f 54 20 43 4c 4f 53 45 5c 6e 22 29  ID NOT CLOSE\n")
40e0: 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
40f0: 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  ; */.    return;
4100: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 61 67 69 63  .  }.  db->magic
4110: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
4120: 43 4c 4f 53 45 44 3b 0a 20 20 66 6f 72 28 6a 3d  CLOSED;.  for(j=
4130: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
4140: 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
4150: 61 44 62 5b 6a 5d 2e 70 42 74 20 29 7b 0a 20 20  aDb[j].pBt ){.  
4160: 20 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 43      sqliteBtreeC
4170: 6c 6f 73 65 28 64 62 2d 3e 61 44 62 5b 6a 5d 2e  lose(db->aDb[j].
4180: 70 42 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  pBt);.      db->
4190: 61 44 62 5b 6a 5d 2e 70 42 74 20 3d 20 30 3b 0a  aDb[j].pBt = 0;.
41a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
41b0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =2 ){.      sqli
41c0: 74 65 46 72 65 65 28 64 62 2d 3e 61 44 62 5b 6a  teFree(db->aDb[j
41d0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
41e0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
41f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
4200: 20 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74    sqliteResetInt
4210: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
4220: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
4230: 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73  ->nDb<=2 );.  as
4240: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64  sert( db->aDb==d
4250: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a  b->aDbStatic );.
4260: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
4270: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75  shFirst(&db->aFu
4280: 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  nc); i; i=sqlite
4290: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
42a0: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
42b0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 66 6f  , *pNext;.    fo
42c0: 72 28 70 46 75 6e 63 20 3d 20 28 46 75 6e 63 44  r(pFunc = (FuncD
42d0: 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  ef*)sqliteHashDa
42e0: 74 61 28 69 29 3b 20 70 46 75 6e 63 3b 20 70 46  ta(i); pFunc; pF
42f0: 75 6e 63 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  unc=pNext){.    
4300: 20 20 70 4e 65 78 74 20 3d 20 70 46 75 6e 63 2d    pNext = pFunc-
4310: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
4320: 6c 69 74 65 46 72 65 65 28 70 46 75 6e 63 29 3b  liteFree(pFunc);
4330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
4340: 69 74 65 48 61 73 68 43 6c 65 61 72 28 26 64 62  iteHashClear(&db
4350: 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 73 71 6c 69  ->aFunc);.  sqli
4360: 74 65 46 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  teFree(db);.}../
4370: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
4380: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 53 51   if the given SQ
4390: 4c 20 73 74 72 69 6e 67 20 65 6e 64 73 20 69 6e  L string ends in
43a0: 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a   a semicolon..**
43b0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64  .** Special hand
43c0: 6c 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 20  ling is require 
43d0: 66 6f 72 20 43 52 45 41 54 45 20 54 52 49 47 47  for CREATE TRIGG
43e0: 45 52 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  ER statements..*
43f0: 2a 20 57 68 65 6e 65 76 65 72 20 74 68 65 20 43  * Whenever the C
4400: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 6b 65  REATE TRIGGER ke
4410: 79 77 6f 72 64 73 20 61 72 65 20 73 65 65 6e 2c  ywords are seen,
4420: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
4430: 2a 20 6d 75 73 74 20 65 6e 64 20 77 69 74 68 20  * must end with 
4440: 22 3b 45 4e 44 3b 22 2e 0a 2a 2f 0a 69 6e 74 20  ";END;"..*/.int 
4450: 73 71 6c 69 74 65 5f 63 6f 6d 70 6c 65 74 65 28  sqlite_complete(
4460: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
4470: 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  ){.  int isCompl
4480: 65 74 65 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  ete = 1;.  int r
4490: 65 71 75 69 72 65 45 6e 64 20 3d 20 30 3b 0a 20  equireEnd = 0;. 
44a0: 20 69 6e 74 20 73 65 65 6e 54 65 78 74 20 3d 20   int seenText = 
44b0: 30 3b 0a 20 20 69 6e 74 20 73 65 65 6e 43 72 65  0;.  int seenCre
44c0: 61 74 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ate = 0;.  while
44d0: 28 20 2a 7a 53 71 6c 20 29 7b 0a 20 20 20 20 73  ( *zSql ){.    s
44e0: 77 69 74 63 68 28 20 2a 7a 53 71 6c 20 29 7b 0a  witch( *zSql ){.
44f0: 20 20 20 20 20 20 63 61 73 65 20 27 3b 27 3a 20        case ';': 
4500: 7b 0a 20 20 20 20 20 20 20 20 69 73 43 6f 6d 70  {.        isComp
4510: 6c 65 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  lete = 1;.      
4520: 20 20 73 65 65 6e 54 65 78 74 20 3d 20 31 3b 0a    seenText = 1;.
4530: 20 20 20 20 20 20 20 20 73 65 65 6e 43 72 65 61          seenCrea
4540: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
4550: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4560: 20 20 20 20 20 63 61 73 65 20 27 20 27 3a 0a 20       case ' ':. 
4570: 20 20 20 20 20 63 61 73 65 20 27 5c 74 27 3a 0a       case '\t':.
4580: 20 20 20 20 20 20 63 61 73 65 20 27 5c 6e 27 3a        case '\n':
4590: 0a 20 20 20 20 20 20 63 61 73 65 20 27 5c 66 27  .      case '\f'
45a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  : {.        brea
45b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
45c0: 20 63 61 73 65 20 27 5b 27 3a 20 7b 0a 20 20 20   case '[': {.   
45d0: 20 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20       isComplete 
45e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 65 65  = 0;.        see
45f0: 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20  nText = 1;.     
4600: 20 20 20 73 65 65 6e 43 72 65 61 74 65 20 3d 20     seenCreate = 
4610: 30 3b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 2b  0;.        zSql+
4620: 2b 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  +;.        while
4630: 28 20 2a 7a 53 71 6c 20 26 26 20 2a 7a 53 71 6c  ( *zSql && *zSql
4640: 21 3d 27 5d 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b  !=']' ){ zSql++;
4650: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a   }.        if( *
4660: 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
4670: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
4680: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4690: 20 63 61 73 65 20 27 22 27 3a 0a 20 20 20 20 20   case '"':.     
46a0: 20 63 61 73 65 20 27 5c 27 27 3a 20 7b 0a 20 20   case '\'': {.  
46b0: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 7a        int c = *z
46c0: 53 71 6c 3b 0a 20 20 20 20 20 20 20 20 69 73 43  Sql;.        isC
46d0: 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20  omplete = 0;.   
46e0: 20 20 20 20 20 73 65 65 6e 54 65 78 74 20 3d 20       seenText = 
46f0: 31 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 43  1;.        seenC
4700: 72 65 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  reate = 0;.     
4710: 20 20 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20     zSql++;.     
4720: 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 71 6c 20     while( *zSql 
4730: 26 26 20 2a 7a 53 71 6c 21 3d 63 20 29 7b 20 7a  && *zSql!=c ){ z
4740: 53 71 6c 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  Sql++; }.       
4750: 20 69 66 28 20 2a 7a 53 71 6c 3d 3d 30 20 29 20   if( *zSql==0 ) 
4760: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
4770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4780: 0a 20 20 20 20 20 20 63 61 73 65 20 27 2d 27 3a  .      case '-':
4790: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   {.        if( z
47a0: 53 71 6c 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20  Sql[1]!='-' ){. 
47b0: 20 20 20 20 20 20 20 20 20 69 73 43 6f 6d 70 6c           isCompl
47c0: 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ete = 0;.       
47d0: 20 20 20 73 65 65 6e 43 72 65 61 74 65 20 3d 20     seenCreate = 
47e0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
47f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4800: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53        while( *zS
4810: 71 6c 20 26 26 20 2a 7a 53 71 6c 21 3d 27 5c 6e  ql && *zSql!='\n
4820: 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20  ' ){ zSql++; }. 
4830: 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 71 6c         if( *zSql
4840: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 73 65 65  ==0 ) return see
4850: 6e 54 65 78 74 20 26 26 20 69 73 43 6f 6d 70 6c  nText && isCompl
4860: 65 74 65 20 26 26 20 72 65 71 75 69 72 65 45 6e  ete && requireEn
4870: 64 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 62 72  d==0;.        br
4880: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4890: 20 20 20 63 61 73 65 20 27 63 27 3a 0a 20 20 20     case 'c':.   
48a0: 20 20 20 63 61 73 65 20 27 43 27 3a 20 7b 0a 20     case 'C': {. 
48b0: 20 20 20 20 20 20 20 73 65 65 6e 54 65 78 74 20         seenText 
48c0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
48d0: 20 21 69 73 43 6f 6d 70 6c 65 74 65 20 29 20 62   !isComplete ) b
48e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 73  reak;.        is
48f0: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20  Complete = 0;.  
4900: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4910: 53 74 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20 22  StrNICmp(zSql, "
4920: 63 72 65 61 74 65 22 2c 20 36 29 21 3d 30 20 29  create", 6)!=0 )
4930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4940: 69 66 28 20 21 69 73 73 70 61 63 65 28 7a 53 71  if( !isspace(zSq
4950: 6c 5b 36 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20  l[6]) ) break;. 
4960: 20 20 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20 35         zSql += 5
4970: 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 43 72  ;.        seenCr
4980: 65 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  eate = 1;.      
4990: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
49a0: 28 7a 53 71 6c 5b 31 5d 29 20 29 20 7a 53 71 6c  (zSql[1]) ) zSql
49b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
49c0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26  sqliteStrNICmp(&
49d0: 7a 53 71 6c 5b 31 5d 2c 22 74 72 69 67 67 65 72  zSql[1],"trigger
49e0: 22 2c 20 37 29 21 3d 30 20 29 20 62 72 65 61 6b  ", 7)!=0 ) break
49f0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 20 2b  ;.        zSql +
4a00: 3d 20 37 3b 0a 20 20 20 20 20 20 20 20 72 65 71  = 7;.        req
4a10: 75 69 72 65 45 6e 64 2b 2b 3b 0a 20 20 20 20 20  uireEnd++;.     
4a20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4a30: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 27 74 27  }.      case 't'
4a40: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 27 54 27  :.      case 'T'
4a50: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e  : {.        seen
4a60: 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Text = 1;.      
4a70: 20 20 69 66 28 20 21 73 65 65 6e 43 72 65 61 74    if( !seenCreat
4a80: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
4a90: 20 20 20 73 65 65 6e 43 72 65 61 74 65 20 3d 20     seenCreate = 
4aa0: 30 3b 0a 20 20 20 20 20 20 20 20 69 73 43 6f 6d  0;.        isCom
4ab0: 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  plete = 0;.     
4ac0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74 72     if( sqliteStr
4ad0: 4e 49 43 6d 70 28 7a 53 71 6c 2c 20 22 74 72 69  NICmp(zSql, "tri
4ae0: 67 67 65 72 22 2c 20 37 29 21 3d 30 20 29 20 62  gger", 7)!=0 ) b
4af0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
4b00: 28 20 21 69 73 73 70 61 63 65 28 7a 53 71 6c 5b  ( !isspace(zSql[
4b10: 37 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  7]) ) break;.   
4b20: 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20 36 3b 0a       zSql += 6;.
4b30: 20 20 20 20 20 20 20 20 72 65 71 75 69 72 65 45          requireE
4b40: 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  nd++;.        br
4b50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4b60: 20 20 20 63 61 73 65 20 27 65 27 3a 0a 20 20 20     case 'e':.   
4b70: 20 20 20 63 61 73 65 20 27 45 27 3a 20 7b 0a 20     case 'E': {. 
4b80: 20 20 20 20 20 20 20 73 65 65 6e 43 72 65 61 74         seenCreat
4b90: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  e = 0;.        s
4ba0: 65 65 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 20  eenText = 1;.   
4bb0: 20 20 20 20 20 69 66 28 20 21 69 73 43 6f 6d 70       if( !isComp
4bc0: 6c 65 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  lete ) break;.  
4bd0: 20 20 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65        isComplete
4be0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
4bf0: 28 20 72 65 71 75 69 72 65 45 6e 64 3d 3d 30 20  ( requireEnd==0 
4c00: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
4c10: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49   if( sqliteStrNI
4c20: 43 6d 70 28 7a 53 71 6c 2c 20 22 65 6e 64 22 2c  Cmp(zSql, "end",
4c30: 20 33 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a   3)!=0 ) break;.
4c40: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20          zSql += 
4c50: 32 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  2;.        while
4c60: 28 20 69 73 73 70 61 63 65 28 7a 53 71 6c 5b 31  ( isspace(zSql[1
4c70: 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20  ]) ) zSql++;.   
4c80: 20 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 31 5d       if( zSql[1]
4c90: 3d 3d 27 3b 27 20 29 7b 0a 20 20 20 20 20 20 20  ==';' ){.       
4ca0: 20 20 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20     zSql++;.     
4cb0: 20 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20       isComplete 
4cc0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 1;.          r
4cd0: 65 71 75 69 72 65 45 6e 64 2d 2d 3b 0a 20 20 20  equireEnd--;.   
4ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
4cf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4d00: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4d10: 20 20 20 20 20 20 20 73 65 65 6e 43 72 65 61 74         seenCreat
4d20: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  e = 0;.        s
4d30: 65 65 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 20  eenText = 1;.   
4d40: 20 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20       isComplete 
4d50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 0;.        bre
4d60: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4d70: 7d 0a 20 20 20 20 7a 53 71 6c 2b 2b 3b 0a 20 20  }.    zSql++;.  
4d80: 7d 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6e 54  }.  return seenT
4d90: 65 78 74 20 26 26 20 69 73 43 6f 6d 70 6c 65 74  ext && isComplet
4da0: 65 20 26 26 20 72 65 71 75 69 72 65 45 6e 64 3d  e && requireEnd=
4db0: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  =0;.}../*.** Rol
4dc0: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
4dd0: 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69  se files..*/.voi
4de0: 64 20 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b  d sqliteRollback
4df0: 41 6c 6c 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  All(sqlite *db){
4e00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4e10: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
4e20: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
4e30: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a  ->aDb[i].pBt ){.
4e40: 20 20 20 20 20 20 73 71 6c 69 74 65 42 74 72 65        sqliteBtre
4e50: 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44  eRollback(db->aD
4e60: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20  b[i].pBt);.     
4e70: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72   db->aDb[i].inTr
4e80: 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ans = 0;.    }. 
4e90: 20 7d 0a 20 20 73 71 6c 69 74 65 52 6f 6c 6c 62   }.  sqliteRollb
4ea0: 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  ackInternalChang
4eb0: 65 73 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  es(db);.}../*.**
4ec0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
4ed0: 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 65  es the work of e
4ee0: 69 74 68 65 72 20 73 71 6c 69 74 65 5f 65 78 65  ither sqlite_exe
4ef0: 63 28 29 20 6f 72 20 73 71 6c 69 74 65 5f 63 6f  c() or sqlite_co
4f00: 6d 70 69 6c 65 28 29 2e 0a 2a 2a 20 49 74 20 77  mpile()..** It w
4f10: 6f 72 6b 73 20 6c 69 6b 65 20 73 71 6c 69 74 65  orks like sqlite
4f20: 5f 65 78 65 63 28 29 20 69 66 20 70 56 6d 3d 3d  _exec() if pVm==
4f30: 4e 55 4c 4c 20 61 6e 64 20 69 74 20 77 6f 72 6b  NULL and it work
4f40: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 5f 63 6f  s like sqlite_co
4f50: 6d 70 69 6c 65 28 29 0a 2a 2a 20 6f 74 68 65 72  mpile().** other
4f60: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
4f70: 69 6e 74 20 73 71 6c 69 74 65 4d 61 69 6e 28 0a  int sqliteMain(.
4f80: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4fa0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 6e   The database on
4fb0: 20 77 68 69 63 68 20 74 68 65 20 53 51 4c 20 65   which the SQL e
4fc0: 78 65 63 75 74 65 73 20 2a 2f 0a 20 20 63 6f 6e  xecutes */.  con
4fd0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20  st char *zSql,  
4fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4ff0: 53 51 4c 20 74 6f 20 62 65 20 65 78 65 63 75 74  SQL to be execut
5000: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 63  ed */.  sqlite_c
5010: 61 6c 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61 63  allback xCallbac
5020: 6b 2c 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  k,  /* Invoke th
5030: 69 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  is callback rout
5040: 69 6e 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ine */.  void *p
5050: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
5060: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
5070: 67 75 6d 65 6e 74 20 74 6f 20 78 43 61 6c 6c 62  gument to xCallb
5080: 61 63 6b 28 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  ack() */.  const
5090: 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 2c 20   char **pzTail, 
50a0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
50b0: 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20 61 66  ext statement af
50c0: 74 65 72 20 74 68 65 20 66 69 72 73 74 20 2a 2f  ter the first */
50d0: 0a 20 20 73 71 6c 69 74 65 5f 76 6d 20 2a 2a 70  .  sqlite_vm **p
50e0: 70 56 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pVm,           /
50f0: 2a 20 4f 55 54 3a 20 54 68 65 20 76 69 72 74 75  * OUT: The virtu
5100: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
5110: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
5120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5130: 55 54 3a 20 57 72 69 74 65 20 65 72 72 6f 72 20  UT: Write error 
5140: 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f  messages here */
5150: 0a 29 7b 0a 20 20 50 61 72 73 65 20 73 50 61 72  .){.  Parse sPar
5160: 73 65 3b 0a 0a 20 20 69 66 28 20 70 7a 45 72 72  se;..  if( pzErr
5170: 4d 73 67 20 29 20 2a 70 7a 45 72 72 4d 73 67 20  Msg ) *pzErrMsg 
5180: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
5190: 65 53 61 66 65 74 79 4f 6e 28 64 62 29 20 29 20  eSafetyOn(db) ) 
51a0: 67 6f 74 6f 20 65 78 65 63 5f 6d 69 73 75 73 65  goto exec_misuse
51b0: 3b 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ;.  if( (db->fla
51c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74  gs & SQLITE_Init
51d0: 69 61 6c 69 7a 65 64 29 3d 3d 30 20 29 7b 0a 20  ialized)==0 ){. 
51e0: 20 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d     int rc, cnt =
51f0: 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   1;.    while( (
5200: 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69 74 28  rc = sqliteInit(
5210: 64 62 2c 20 70 7a 45 72 72 4d 73 67 29 29 3d 3d  db, pzErrMsg))==
5220: 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20 20  SQLITE_BUSY.    
5230: 20 20 20 26 26 20 64 62 2d 3e 78 42 75 73 79 43     && db->xBusyC
5240: 61 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d 3e 78  allback && db->x
5250: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 64 62 2d  BusyCallback(db-
5260: 3e 70 42 75 73 79 41 72 67 2c 20 22 22 2c 20 63  >pBusyArg, "", c
5270: 6e 74 2b 2b 29 21 3d 30 20 29 7b 7d 0a 20 20 20  nt++)!=0 ){}.   
5280: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5290: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
52a0: 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45  teStrRealloc(pzE
52b0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
52c0: 6c 69 74 65 53 61 66 65 74 79 4f 66 66 28 64 62  liteSafetyOff(db
52d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
52e0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
52f0: 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  ( pzErrMsg ){.  
5300: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
5310: 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  pzErrMsg);.     
5320: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a   *pzErrMsg = 0;.
5330: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5340: 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3c  db->file_format<
5350: 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  3 ){.    sqliteS
5360: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20  afetyOff(db);.  
5370: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
5380: 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 6f 62 73  g(pzErrMsg, "obs
5390: 6f 6c 65 74 65 20 64 61 74 61 62 61 73 65 20 66  olete database f
53a0: 69 6c 65 20 66 6f 72 6d 61 74 22 2c 20 30 29 3b  ile format", 0);
53b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
53c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
53d0: 69 66 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 30  if( db->pVdbe==0
53e0: 20 29 7b 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20   ){ db->nChange 
53f0: 3d 20 30 3b 20 7d 0a 20 20 6d 65 6d 73 65 74 28  = 0; }.  memset(
5400: 26 73 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65  &sParse, 0, size
5410: 6f 66 28 73 50 61 72 73 65 29 29 3b 0a 20 20 73  of(sParse));.  s
5420: 50 61 72 73 65 2e 64 62 20 3d 20 64 62 3b 0a 20  Parse.db = db;. 
5430: 20 73 50 61 72 73 65 2e 78 43 61 6c 6c 62 61 63   sParse.xCallbac
5440: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
5450: 20 73 50 61 72 73 65 2e 70 41 72 67 20 3d 20 70   sParse.pArg = p
5460: 41 72 67 3b 0a 20 20 73 50 61 72 73 65 2e 75 73  Arg;.  sParse.us
5470: 65 43 61 6c 6c 62 61 63 6b 20 3d 20 70 70 56 6d  eCallback = ppVm
5480: 3d 3d 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ==0;.#ifndef SQL
5490: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20  ITE_OMIT_TRACE. 
54a0: 20 69 66 28 20 64 62 2d 3e 78 54 72 61 63 65 20   if( db->xTrace 
54b0: 29 20 64 62 2d 3e 78 54 72 61 63 65 28 64 62 2d  ) db->xTrace(db-
54c0: 3e 70 54 72 61 63 65 41 72 67 2c 20 7a 53 71 6c  >pTraceArg, zSql
54d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
54e0: 74 65 52 75 6e 50 61 72 73 65 72 28 26 73 50 61  teRunParser(&sPa
54f0: 72 73 65 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72  rse, zSql, pzErr
5500: 4d 73 67 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Msg);.  if( sqli
5510: 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  te_malloc_failed
5520: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
5530: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
5540: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
5550: 22 2c 20 30 29 3b 0a 20 20 20 20 73 50 61 72 73  ", 0);.    sPars
5560: 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  e.rc = SQLITE_NO
5570: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 52  MEM;.    sqliteR
5580: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
5590: 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49      sqliteResetI
55a0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
55b0: 2c 20 30 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  , 0);.    db->fl
55c0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
55d0: 6e 54 72 61 6e 73 3b 0a 20 20 7d 0a 20 20 69 66  nTrans;.  }.  if
55e0: 28 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51 4c  ( sParse.rc==SQL
55f0: 49 54 45 5f 44 4f 4e 45 20 29 20 73 50 61 72 73  ITE_DONE ) sPars
5600: 65 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  e.rc = SQLITE_OK
5610: 3b 0a 20 20 69 66 28 20 73 50 61 72 73 65 2e 72  ;.  if( sParse.r
5620: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
5630: 70 7a 45 72 72 4d 73 67 20 26 26 20 2a 70 7a 45  pzErrMsg && *pzE
5640: 72 72 4d 73 67 3d 3d 30 20 29 7b 0a 20 20 20 20  rrMsg==0 ){.    
5650: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
5660: 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  pzErrMsg, sqlite
5670: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 73 50  _error_string(sP
5680: 61 72 73 65 2e 72 63 29 2c 20 30 29 3b 0a 20 20  arse.rc), 0);.  
5690: 7d 0a 20 20 73 71 6c 69 74 65 53 74 72 52 65 61  }.  sqliteStrRea
56a0: 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a  lloc(pzErrMsg);.
56b0: 20 20 69 66 28 20 73 50 61 72 73 65 2e 72 63 3d    if( sParse.rc=
56c0: 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 29  =SQLITE_SCHEMA )
56d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73 65  {.    sqliteRese
56e0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
56f0: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  db, 0);.  }.  if
5700: 28 20 73 50 61 72 73 65 2e 75 73 65 43 61 6c 6c  ( sParse.useCall
5710: 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 61  back==0 ){.    a
5720: 73 73 65 72 74 28 20 70 70 56 6d 20 29 3b 0a 20  ssert( ppVm );. 
5730: 20 20 20 2a 70 70 56 6d 20 3d 20 28 73 71 6c 69     *ppVm = (sqli
5740: 74 65 5f 76 6d 2a 29 73 50 61 72 73 65 2e 70 56  te_vm*)sParse.pV
5750: 64 62 65 3b 0a 20 20 20 20 2a 70 7a 54 61 69 6c  dbe;.    *pzTail
5760: 20 3d 20 73 50 61 72 73 65 2e 7a 54 61 69 6c 3b   = sParse.zTail;
5770: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
5780: 65 53 61 66 65 74 79 4f 66 66 28 64 62 29 20 29  eSafetyOff(db) )
5790: 20 67 6f 74 6f 20 65 78 65 63 5f 6d 69 73 75 73   goto exec_misus
57a0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 50 61 72  e;.  return sPar
57b0: 73 65 2e 72 63 3b 0a 0a 65 78 65 63 5f 6d 69 73  se.rc;..exec_mis
57c0: 75 73 65 3a 0a 20 20 69 66 28 20 70 7a 45 72 72  use:.  if( pzErr
57d0: 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  Msg ){.    *pzEr
57e0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71  rMsg = 0;.    sq
57f0: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a  liteSetString(pz
5800: 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 5f 65  ErrMsg, sqlite_e
5810: 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 51 4c 49  rror_string(SQLI
5820: 54 45 5f 4d 49 53 55 53 45 29 2c 20 30 29 3b 0a  TE_MISUSE), 0);.
5830: 20 20 20 20 73 71 6c 69 74 65 53 74 72 52 65 61      sqliteStrRea
5840: 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a  lloc(pzErrMsg);.
5850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5860: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 0a 2f  ITE_MISUSE;.}../
5870: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 53 51 4c  *.** Execute SQL
5880: 20 63 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 6f   code.  Return o
5890: 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
58a0: 5f 20 73 75 63 63 65 73 73 2f 66 61 69 6c 75 72  _ success/failur
58b0: 65 0a 2a 2a 20 63 6f 64 65 73 2e 20 20 41 6c 73  e.** codes.  Als
58c0: 6f 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  o write an error
58d0: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 6d 65   message into me
58e0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
58f0: 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 61  om.** malloc() a
5900: 6e 64 20 6d 61 6b 65 20 2a 70 7a 45 72 72 4d 73  nd make *pzErrMs
5910: 67 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20  g point to that 
5920: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  message..**.** I
5930: 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 71  f the SQL is a q
5940: 75 65 72 79 2c 20 74 68 65 6e 20 66 6f 72 20 65  uery, then for e
5950: 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 71  ach row in the q
5960: 75 65 72 79 20 72 65 73 75 6c 74 0a 2a 2a 20 74  uery result.** t
5970: 68 65 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 66  he xCallback() f
5980: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
5990: 64 2e 20 20 70 41 72 67 20 62 65 63 6f 6d 65 73  d.  pArg becomes
59a0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
59b0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 61 6c 6c 62  gument to xCallb
59c0: 61 63 6b 28 29 2e 20 20 49 66 20 78 43 61 6c 6c  ack().  If xCall
59d0: 62 61 63 6b 3d 4e 55 4c 4c 20 74 68 65 6e 20 6e  back=NULL then n
59e0: 6f 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73  o callback.** is
59f0: 20 69 6e 76 6f 6b 65 64 2c 20 65 76 65 6e 20 66   invoked, even f
5a00: 6f 72 20 71 75 65 72 69 65 73 2e 0a 2a 2f 0a 69  or queries..*/.i
5a10: 6e 74 20 73 71 6c 69 74 65 5f 65 78 65 63 28 0a  nt sqlite_exec(.
5a20: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a40: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 6e   The database on
5a50: 20 77 68 69 63 68 20 74 68 65 20 53 51 4c 20 65   which the SQL e
5a60: 78 65 63 75 74 65 73 20 2a 2f 0a 20 20 63 6f 6e  xecutes */.  con
5a70: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20  st char *zSql,  
5a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5a90: 53 51 4c 20 74 6f 20 62 65 20 65 78 65 63 75 74  SQL to be execut
5aa0: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 63  ed */.  sqlite_c
5ab0: 61 6c 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61 63  allback xCallbac
5ac0: 6b 2c 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68  k,  /* Invoke th
5ad0: 69 73 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  is callback rout
5ae0: 69 6e 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ine */.  void *p
5af0: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
5b00: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
5b10: 67 75 6d 65 6e 74 20 74 6f 20 78 43 61 6c 6c 62  gument to xCallb
5b20: 61 63 6b 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ack() */.  char 
5b30: 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
5b40: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
5b50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
5b60: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  ere */.){.  retu
5b70: 72 6e 20 73 71 6c 69 74 65 4d 61 69 6e 28 64 62  rn sqliteMain(db
5b80: 2c 20 7a 53 71 6c 2c 20 78 43 61 6c 6c 62 61 63  , zSql, xCallbac
5b90: 6b 2c 20 70 41 72 67 2c 20 30 2c 20 30 2c 20 70  k, pArg, 0, 0, p
5ba0: 7a 45 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a  zErrMsg);.}../*.
5bb0: 2a 2a 20 43 6f 6d 70 69 6c 65 20 61 20 73 69 6e  ** Compile a sin
5bc0: 67 6c 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 66  gle statement of
5bd0: 20 53 51 4c 20 69 6e 74 6f 20 61 20 76 69 72 74   SQL into a virt
5be0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 52 65  ual machine.  Re
5bf0: 74 75 72 6e 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  turn one.** of t
5c00: 68 65 20 53 51 4c 49 54 45 5f 20 73 75 63 63 65  he SQLITE_ succe
5c10: 73 73 2f 66 61 69 6c 75 72 65 20 63 6f 64 65 73  ss/failure codes
5c20: 2e 20 20 41 6c 73 6f 20 77 72 69 74 65 20 61 6e  .  Also write an
5c30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
5c40: 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 62  nto.** memory ob
5c50: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
5c60: 6f 63 28 29 20 61 6e 64 20 6d 61 6b 65 20 2a 70  oc() and make *p
5c70: 7a 45 72 72 4d 73 67 20 70 6f 69 6e 74 20 74 6f  zErrMsg point to
5c80: 20 74 68 61 74 20 6d 65 73 73 61 67 65 2e 0a 2a   that message..*
5c90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 63 6f 6d  /.int sqlite_com
5ca0: 70 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 20 2a  pile(.  sqlite *
5cb0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
5cc0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
5cd0: 61 73 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65  ase on which the
5ce0: 20 53 51 4c 20 65 78 65 63 75 74 65 73 20 2a 2f   SQL executes */
5cf0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5d00: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Sql,           /
5d10: 2a 20 54 68 65 20 53 51 4c 20 74 6f 20 62 65 20  * The SQL to be 
5d20: 65 78 65 63 75 74 65 64 20 2a 2f 0a 20 20 63 6f  executed */.  co
5d30: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69  nst char **pzTai
5d40: 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  l,        /* OUT
5d50: 3a 20 4e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  : Next statement
5d60: 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
5d70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 76 6d 20   */.  sqlite_vm 
5d80: 2a 2a 70 70 56 6d 2c 20 20 20 20 20 20 20 20 20  **ppVm,         
5d90: 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20 76 69    /* OUT: The vi
5da0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f  rtual machine */
5db0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
5dc0: 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  sg             /
5dd0: 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 65 72 72  * OUT: Write err
5de0: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
5df0: 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
5e00: 73 71 6c 69 74 65 4d 61 69 6e 28 64 62 2c 20 7a  sqliteMain(db, z
5e10: 53 71 6c 2c 20 30 2c 20 30 2c 20 70 7a 54 61 69  Sql, 0, 0, pzTai
5e20: 6c 2c 20 70 70 56 6d 2c 20 70 7a 45 72 72 4d 73  l, ppVm, pzErrMs
5e30: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  g);.}../*.** The
5e40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
5e50: 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20 76 69  ne destroys a vi
5e60: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 74 68  rtual machine th
5e70: 61 74 20 69 73 20 63 72 65 61 74 65 64 20 62 79  at is created by
5e80: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 63  .** the sqlite_c
5e90: 6f 6d 70 69 6c 65 28 29 20 72 6f 75 74 69 6e 65  ompile() routine
5ea0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
5eb0: 67 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ger returned is 
5ec0: 61 6e 20 53 51 4c 49 54 45 5f 20 73 75 63 63 65  an SQLITE_ succe
5ed0: 73 73 2f 66 61 69 6c 75 72 65 20 63 6f 64 65 20  ss/failure code 
5ee0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
5ef0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
5f00: 65 78 65 63 75 74 69 6e 67 20 74 68 65 20 76 69  executing the vi
5f10: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
5f20: 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  An error message
5f30: 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69   is.** written i
5f40: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
5f50: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
5f60: 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 20 69 73  and *pzErrMsg is
5f70: 20 6d 61 64 65 20 74 6f 0a 2a 2a 20 70 6f 69 6e   made to.** poin
5f80: 74 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20  t to that error 
5f90: 69 66 20 70 7a 45 72 72 4d 73 67 20 69 73 20 6e  if pzErrMsg is n
5fa0: 6f 74 20 4e 55 4c 4c 2e 20 20 54 68 65 20 63 61  ot NULL.  The ca
5fb0: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
5fc0: 20 73 68 6f 75 6c 64 20 75 73 65 20 73 71 6c 69   should use sqli
5fd0: 74 65 5f 66 72 65 65 6d 65 6d 28 29 20 74 6f 20  te_freemem() to 
5fe0: 64 65 6c 65 74 65 20 74 68 65 20 6d 65 73 73 61  delete the messa
5ff0: 67 65 20 77 68 65 6e 20 69 74 20 68 61 73 20 66  ge when it has f
6000: 69 6e 69 73 68 65 64 0a 2a 2a 20 77 69 74 68 20  inished.** with 
6010: 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
6020: 65 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 73 71  e_finalize(.  sq
6030: 6c 69 74 65 5f 76 6d 20 2a 70 56 6d 2c 20 20 20  lite_vm *pVm,   
6040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6050: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
6060: 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
6070: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
6080: 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
6090: 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 65 72  /* OUT: Write er
60a0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
60b0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
60c0: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 46 69 6e   = sqliteVdbeFin
60d0: 61 6c 69 7a 65 28 28 56 64 62 65 2a 29 70 56 6d  alize((Vdbe*)pVm
60e0: 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  , pzErrMsg);.  s
60f0: 71 6c 69 74 65 53 74 72 52 65 61 6c 6c 6f 63 28  qliteStrRealloc(
6100: 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 65 74  pzErrMsg);.  ret
6110: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6120: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
6130: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
6140: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
6150: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
6160: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
6170: 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ument..*/.const 
6180: 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 65 72 72  char *sqlite_err
6190: 6f 72 5f 73 74 72 69 6e 67 28 69 6e 74 20 72 63  or_string(int rc
61a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
61b0: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63  *z;.  switch( rc
61c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
61d0: 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20  ITE_OK:         
61e0: 7a 20 3d 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f  z = "not an erro
61f0: 72 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r";             
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6210: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6220: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
6230: 7a 20 3d 20 22 53 51 4c 20 6c 6f 67 69 63 20 65  z = "SQL logic e
6240: 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20  rror or missing 
6250: 64 61 74 61 62 61 73 65 22 3b 20 20 20 62 72 65  database";   bre
6260: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6270: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20  ITE_INTERNAL:   
6280: 7a 20 3d 20 22 69 6e 74 65 72 6e 61 6c 20 53 51  z = "internal SQ
6290: 4c 69 74 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  Lite implementat
62a0: 69 6f 6e 20 66 6c 61 77 22 3b 20 20 20 62 72 65  ion flaw";   bre
62b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
62c0: 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20  ITE_PERM:       
62d0: 7a 20 3d 20 22 61 63 63 65 73 73 20 70 65 72 6d  z = "access perm
62e0: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 3b 20  ission denied"; 
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6300: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6310: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
6320: 7a 20 3d 20 22 63 61 6c 6c 62 61 63 6b 20 72 65  z = "callback re
6330: 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62  quested query ab
6340: 6f 72 74 22 3b 20 20 20 20 20 20 20 20 62 72 65  ort";        bre
6350: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6360: 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20  ITE_BUSY:       
6370: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 69 73  z = "database is
6380: 20 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20 20 20   locked";       
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
63a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
63b0: 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
63c0: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 74 61  z = "database ta
63d0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 3b 20  ble is locked"; 
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
63f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6400: 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ITE_NOMEM:      
6410: 7a 20 3d 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  z = "out of memo
6420: 72 79 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ry";            
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6440: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6450: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20  ITE_READONLY:   
6460: 7a 20 3d 20 22 61 74 74 65 6d 70 74 20 74 6f 20  z = "attempt to 
6470: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
6480: 20 64 61 74 61 62 61 73 65 22 3b 20 20 62 72 65   database";  bre
6490: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
64a0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
64b0: 7a 20 3d 20 22 69 6e 74 65 72 72 75 70 74 65 64  z = "interrupted
64c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
64e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
64f0: 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20  ITE_IOERR:      
6500: 7a 20 3d 20 22 64 69 73 6b 20 49 2f 4f 20 65 72  z = "disk I/O er
6510: 72 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20  ror";           
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6530: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6540: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
6550: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 64 69  z = "database di
6560: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
6570: 6f 72 6d 65 64 22 3b 20 20 20 20 20 20 62 72 65  ormed";      bre
6580: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6590: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20  ITE_NOTFOUND:   
65a0: 7a 20 3d 20 22 74 61 62 6c 65 20 6f 72 20 72 65  z = "table or re
65b0: 63 6f 72 64 20 6e 6f 74 20 66 6f 75 6e 64 22 3b  cord not found";
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
65d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
65e0: 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20  ITE_FULL:       
65f0: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 69 73  z = "database is
6600: 20 66 75 6c 6c 22 3b 20 20 20 20 20 20 20 20 20   full";         
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6620: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6630: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20  ITE_CANTOPEN:   
6640: 7a 20 3d 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  z = "unable to o
6650: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
6660: 65 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  e";          bre
6670: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6680: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20  ITE_PROTOCOL:   
6690: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 6c 6f  z = "database lo
66a0: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 66  cking protocol f
66b0: 61 69 6c 75 72 65 22 3b 20 20 20 20 20 62 72 65  ailure";     bre
66c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
66d0: 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20  ITE_EMPTY:      
66e0: 7a 20 3d 20 22 74 61 62 6c 65 20 63 6f 6e 74 61  z = "table conta
66f0: 69 6e 73 20 6e 6f 20 64 61 74 61 22 3b 20 20 20  ins no data";   
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6710: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6720: 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20  ITE_SCHEMA:     
6730: 7a 20 3d 20 22 64 61 74 61 62 61 73 65 20 73 63  z = "database sc
6740: 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64  hema has changed
6750: 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ";           bre
6760: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6770: 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20  ITE_TOOBIG:     
6780: 7a 20 3d 20 22 74 6f 6f 20 6d 75 63 68 20 64 61  z = "too much da
6790: 74 61 20 66 6f 72 20 6f 6e 65 20 74 61 62 6c 65  ta for one table
67a0: 20 72 6f 77 22 3b 20 20 20 20 20 20 20 62 72 65   row";       bre
67b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
67c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20  ITE_CONSTRAINT: 
67d0: 7a 20 3d 20 22 63 6f 6e 73 74 72 61 69 6e 74 20  z = "constraint 
67e0: 66 61 69 6c 65 64 22 3b 20 20 20 20 20 20 20 20  failed";        
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6800: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6810: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
6820: 7a 20 3d 20 22 64 61 74 61 74 79 70 65 20 6d 69  z = "datatype mi
6830: 73 6d 61 74 63 68 22 3b 20 20 20 20 20 20 20 20  smatch";        
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6850: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6860: 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20  ITE_MISUSE:     
6870: 7a 20 3d 20 22 6c 69 62 72 61 72 79 20 72 6f 75  z = "library rou
6880: 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20  tine called out 
6890: 6f 66 20 73 65 71 75 65 6e 63 65 22 3b 62 72 65  of sequence";bre
68a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
68b0: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
68c0: 7a 20 3d 20 22 6b 65 72 6e 65 6c 20 6c 61 63 6b  z = "kernel lack
68d0: 73 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70  s large file sup
68e0: 70 6f 72 74 22 3b 20 20 20 20 20 20 20 62 72 65  port";       bre
68f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
6900: 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20  ITE_AUTH:       
6910: 7a 20 3d 20 22 61 75 74 68 6f 72 69 7a 61 74 69  z = "authorizati
6920: 6f 6e 20 64 65 6e 69 65 64 22 3b 20 20 20 20 20  on denied";     
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6940: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 7a 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  z = "unknown err
6970: 6f 72 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  or";            
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
6990: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
69a0: 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   z;.}../*.** Thi
69b0: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
69c0: 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c  ents a busy call
69d0: 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73  back that sleeps
69e0: 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67   and tries.** ag
69f0: 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65  ain until a time
6a00: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61  out value is rea
6a10: 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f  ched.  The timeo
6a20: 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  ut value is.** a
6a30: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
6a40: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
6a50: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68   passed in as th
6a60: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
6a70: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
6a80: 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  nt sqliteDefault
6a90: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76  BusyCallback(. v
6aa0: 6f 69 64 20 2a 54 69 6d 65 6f 75 74 2c 20 20 20  oid *Timeout,   
6ab0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
6ac0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  um amount of tim
6ad0: 65 20 74 6f 20 77 61 69 74 20 2a 2f 0a 20 63 6f  e to wait */. co
6ae0: 6e 73 74 20 63 68 61 72 20 2a 4e 6f 74 55 73 65  nst char *NotUse
6af0: 64 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61  d,     /* The na
6b00: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6b10: 74 68 61 74 20 69 73 20 62 75 73 79 20 2a 2f 0a  that is busy */.
6b20: 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20   int count      
6b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6b40: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62  ber of times tab
6b50: 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79  le has been busy
6b60: 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54   */.){.#if SQLIT
6b70: 45 5f 4d 49 4e 5f 53 4c 45 45 50 5f 4d 53 3d 3d  E_MIN_SLEEP_MS==
6b80: 31 0a 20 20 69 6e 74 20 64 65 6c 61 79 20 3d 20  1.  int delay = 
6b90: 31 30 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 5f  10;.  int prior_
6ba0: 64 65 6c 61 79 20 3d 20 30 3b 0a 20 20 69 6e 74  delay = 0;.  int
6bb0: 20 74 69 6d 65 6f 75 74 20 3d 20 28 69 6e 74 29   timeout = (int)
6bc0: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 69  Timeout;.  int i
6bd0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  ;..  for(i=1; i<
6be0: 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 20 0a 20 20  count; i++){ .  
6bf0: 20 20 70 72 69 6f 72 5f 64 65 6c 61 79 20 2b 3d    prior_delay +=
6c00: 20 64 65 6c 61 79 3b 0a 20 20 20 20 64 65 6c 61   delay;.    dela
6c10: 79 20 3d 20 64 65 6c 61 79 2a 32 3b 0a 20 20 20  y = delay*2;.   
6c20: 20 69 66 28 20 64 65 6c 61 79 3e 3d 31 30 30 30   if( delay>=1000
6c30: 20 29 7b 0a 20 20 20 20 20 20 64 65 6c 61 79 20   ){.      delay 
6c40: 3d 20 31 30 30 30 3b 0a 20 20 20 20 20 20 70 72  = 1000;.      pr
6c50: 69 6f 72 5f 64 65 6c 61 79 20 2b 3d 20 31 30 30  ior_delay += 100
6c60: 30 2a 28 63 6f 75 6e 74 20 2d 20 69 20 2d 20 31  0*(count - i - 1
6c70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6c80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6c90: 70 72 69 6f 72 5f 64 65 6c 61 79 20 2b 20 64 65  prior_delay + de
6ca0: 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b  lay > timeout ){
6cb0: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d  .    delay = tim
6cc0: 65 6f 75 74 20 2d 20 70 72 69 6f 72 5f 64 65 6c  eout - prior_del
6cd0: 61 79 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  ay;.    if( dela
6ce0: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
6cf0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 53  .  }.  sqliteOsS
6d00: 6c 65 65 70 28 64 65 6c 61 79 29 3b 0a 20 20 72  leep(delay);.  r
6d10: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
6d20: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
6d30: 69 6e 74 29 54 69 6d 65 6f 75 74 3b 0a 20 20 69  int)Timeout;.  i
6d40: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
6d50: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
6d60: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6d70: 0a 20 20 73 71 6c 69 74 65 4f 73 53 6c 65 65 70  .  sqliteOsSleep
6d80: 28 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  (1000);.  return
6d90: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
6da0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6db0: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
6dc0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
6dd0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
6de0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
6df0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
6e00: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
6e10: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
6e20: 64 20 73 71 6c 69 74 65 5f 62 75 73 79 5f 68 61  d sqlite_busy_ha
6e30: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 20  ndler(.  sqlite 
6e40: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
6e50: 73 79 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  sy)(void*,const 
6e60: 63 68 61 72 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f  char*,int),.  vo
6e70: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 64 62  id *pArg.){.  db
6e80: 2d 3e 78 42 75 73 79 43 61 6c 6c 62 61 63 6b 20  ->xBusyCallback 
6e90: 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 70  = xBusy;.  db->p
6ea0: 42 75 73 79 41 72 67 20 3d 20 70 41 72 67 3b 0a  BusyArg = pArg;.
6eb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6ec0: 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61  utine installs a
6ed0: 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61   default busy ha
6ee0: 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73  ndler that waits
6ef0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63   for the.** spec
6f00: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ified number of 
6f10: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66  milliseconds bef
6f20: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e  ore returning 0.
6f30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f  .*/.void sqlite_
6f40: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c  busy_timeout(sql
6f50: 69 74 65 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29  ite *db, int ms)
6f60: 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  {.  if( ms>0 ){.
6f70: 20 20 20 20 73 71 6c 69 74 65 5f 62 75 73 79 5f      sqlite_busy_
6f80: 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69  handler(db, sqli
6f90: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
6fa0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 6d 73  lback, (void*)ms
6fb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6fc0: 73 71 6c 69 74 65 5f 62 75 73 79 5f 68 61 6e 64  sqlite_busy_hand
6fd0: 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ler(db, 0, 0);. 
6fe0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73   }.}../*.** Caus
6ff0: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
7000: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
7010: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
7020: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
7030: 76 6f 69 64 20 73 71 6c 69 74 65 5f 69 6e 74 65  void sqlite_inte
7040: 72 72 75 70 74 28 73 71 6c 69 74 65 20 2a 64 62  rrupt(sqlite *db
7050: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  ){.  db->flags |
7060: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 72 75  = SQLITE_Interru
7070: 70 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  pt;.}../*.** Win
7080: 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 68 6f  dows systems sho
7090: 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  uld call this ro
70a0: 75 74 69 6e 65 20 74 6f 20 66 72 65 65 20 6d 65  utine to free me
70b0: 6d 6f 72 79 20 74 68 61 74 0a 2a 2a 20 69 73 20  mory that.** is 
70c0: 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 65 20  returned in the 
70d0: 69 6e 20 74 68 65 20 65 72 72 6d 73 67 20 70 61  in the errmsg pa
70e0: 72 61 6d 65 74 65 72 20 6f 66 20 73 71 6c 69 74  rameter of sqlit
70f0: 65 5f 6f 70 65 6e 28 29 20 77 68 65 6e 0a 2a 2a  e_open() when.**
7100: 20 53 51 4c 69 74 65 20 69 73 20 61 20 44 4c 4c   SQLite is a DLL
7110: 2e 20 20 46 6f 72 20 73 6f 6d 65 20 72 65 61 73  .  For some reas
7120: 6f 6e 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  on, it does not 
7130: 77 6f 72 6b 20 74 6f 20 63 61 6c 6c 20 66 72 65  work to call fre
7140: 65 28 29 0a 2a 2a 20 64 69 72 65 63 74 6c 79 2e  e().** directly.
7150: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
7160: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c   we need to call
7170: 20 66 72 65 65 28 29 20 6e 6f 74 20 73 71 6c 69   free() not sqli
7180: 74 65 46 72 65 65 28 29 20 68 65 72 65 2c 20 73  teFree() here, s
7190: 69 6e 63 65 20 65 76 65 72 79 0a 2a 2a 20 73 74  ince every.** st
71a0: 72 69 6e 67 20 74 68 61 74 20 69 73 20 65 78 70  ring that is exp
71b0: 6f 72 74 65 64 20 66 72 6f 6d 20 53 51 4c 69 74  orted from SQLit
71c0: 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  e should have al
71d0: 72 65 61 64 79 20 70 61 73 73 65 64 20 74 68 72  ready passed thr
71e0: 6f 75 67 68 0a 2a 2a 20 73 71 6c 69 74 65 53 74  ough.** sqliteSt
71f0: 72 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 76  rRealloc()..*/.v
7200: 6f 69 64 20 73 71 6c 69 74 65 5f 66 72 65 65 6d  oid sqlite_freem
7210: 65 6d 28 76 6f 69 64 20 2a 70 29 7b 20 66 72 65  em(void *p){ fre
7220: 65 28 70 29 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 57  e(p); }../*.** W
7230: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 6e  indows systems n
7240: 65 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  eed functions to
7250: 20 63 61 6c 6c 20 74 6f 20 72 65 74 75 72 6e 20   call to return 
7260: 74 68 65 20 73 71 6c 69 74 65 5f 76 65 72 73 69  the sqlite_versi
7270: 6f 6e 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  on.** and sqlite
7280: 5f 65 6e 63 6f 64 69 6e 67 20 73 74 72 69 6e 67  _encoding string
7290: 73 20 73 69 6e 63 65 20 74 68 65 79 20 61 72 65  s since they are
72a0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 63 63 65 73   unable to acces
72b0: 73 20 63 6f 6e 73 74 61 6e 74 73 0a 2a 2a 20 77  s constants.** w
72c0: 69 74 68 69 6e 20 44 4c 4c 73 2e 0a 2a 2f 0a 63  ithin DLLs..*/.c
72d0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
72e0: 65 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  e_libversion(voi
72f0: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
7300: 65 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 63 6f 6e  e_version; }.con
7310: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f  st char *sqlite_
7320: 6c 69 62 65 6e 63 6f 64 69 6e 67 28 76 6f 69 64  libencoding(void
7330: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
7340: 5f 65 6e 63 6f 64 69 6e 67 3b 20 7d 0a 0a 2f 2a  _encoding; }../*
7350: 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75  .** Create new u
7360: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
7370: 74 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69  tions.  The sqli
7380: 74 65 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  te_create_functi
7390: 6f 6e 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  on().** routine 
73a0: 63 72 65 61 74 65 73 20 61 20 72 65 67 75 6c 61  creates a regula
73b0: 72 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  r function and s
73c0: 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 61 67 67  qlite_create_agg
73d0: 72 65 67 61 74 65 28 29 0a 2a 2a 20 63 72 65 61  regate().** crea
73e0: 74 65 73 20 61 6e 20 61 67 67 72 65 67 61 74 65  tes an aggregate
73f0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
7400: 20 50 61 73 73 69 6e 67 20 61 20 4e 55 4c 4c 20   Passing a NULL 
7410: 78 46 75 6e 63 20 61 72 67 75 6d 65 6e 74 20 6f  xFunc argument o
7420: 72 20 4e 55 4c 4c 20 78 53 74 65 70 20 61 6e 64  r NULL xStep and
7430: 20 78 46 69 6e 61 6c 69 7a 65 20 61 72 67 75 6d   xFinalize argum
7440: 65 6e 74 73 0a 2a 2a 20 64 69 73 61 62 6c 65 73  ents.** disables
7450: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
7460: 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 63  Calling sqlite_c
7470: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
7480: 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 61 6d   with the.** sam
7490: 65 20 6e 61 6d 65 20 61 6e 64 20 6e 75 6d 62 65  e name and numbe
74a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61  r of arguments a
74b0: 73 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  s a prior call t
74c0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 5f 63 72 65 61  o.** sqlite_crea
74d0: 74 65 5f 61 67 67 72 65 67 61 74 65 28 29 20 64  te_aggregate() d
74e0: 69 73 61 62 6c 65 73 20 74 68 65 20 70 72 69 6f  isables the prio
74f0: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  r call to.** sql
7500: 69 74 65 5f 63 72 65 61 74 65 5f 61 67 67 72 65  ite_create_aggre
7510: 67 61 74 65 28 29 2c 20 61 6e 64 20 76 69 63 65  gate(), and vice
7520: 20 76 65 72 73 61 2e 0a 2a 2a 0a 2a 2a 20 49 66   versa..**.** If
7530: 20 6e 41 72 67 20 69 73 20 2d 31 20 69 74 20 6d   nArg is -1 it m
7540: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 66  eans that this f
7550: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 63 63  unction will acc
7560: 65 70 74 20 61 6e 79 20 6e 75 6d 62 65 72 0a 2a  ept any number.*
7570: 2a 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2c 20  * of arguments, 
7580: 69 6e 63 6c 75 64 69 6e 67 20 30 2e 0a 2a 2f 0a  including 0..*/.
7590: 69 6e 74 20 73 71 6c 69 74 65 5f 63 72 65 61 74  int sqlite_creat
75a0: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  e_function(.  sq
75b0: 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20  lite *db,       
75c0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 66 75     /* Add the fu
75d0: 6e 63 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 64  nction to this d
75e0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
75f0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
7600: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 2f 2a 20  ar *zName,   /* 
7610: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
7620: 74 69 6f 6e 20 74 6f 20 61 64 64 20 2a 2f 0a 20  tion to add */. 
7630: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
7640: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7650: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
7660: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
7670: 73 71 6c 69 74 65 5f 66 75 6e 63 2a 2c 69 6e 74  sqlite_func*,int
7680: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 2c 20  ,const char**), 
7690: 20 2f 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e   /* The implemen
76a0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  tation */.  void
76b0: 20 2a 70 55 73 65 72 44 61 74 61 20 20 20 20 20   *pUserData     
76c0: 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20 2a 2f   /* User data */
76d0: 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70  .){.  FuncDef *p
76e0: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
76f0: 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c 20 7a 4e   if( db==0 || zN
7700: 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
7710: 53 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20  SafetyCheck(db) 
7720: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6e 4e  ) return 1;.  nN
7730: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
7740: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65  me);.  if( nName
7750: 3e 32 35 35 20 29 20 72 65 74 75 72 6e 20 31 3b  >255 ) return 1;
7760: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 46 69 6e  .  p = sqliteFin
7770: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
7780: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
7790: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  , 1);.  if( p==0
77a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70   ) return 1;.  p
77b0: 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b  ->xFunc = xFunc;
77c0: 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 30 3b  .  p->xStep = 0;
77d0: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
77e0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  = 0;.  p->pUserD
77f0: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
7800: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 69  .  return 0;.}.i
7810: 6e 74 20 73 71 6c 69 74 65 5f 63 72 65 61 74 65  nt sqlite_create
7820: 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 73 71  _aggregate(.  sq
7830: 6c 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20  lite *db,       
7840: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 66 75     /* Add the fu
7850: 6e 63 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 64  nction to this d
7860: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
7870: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
7880: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 2f 2a 20  ar *zName,   /* 
7890: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63  Name of the func
78a0: 74 69 6f 6e 20 74 6f 20 61 64 64 20 2a 2f 0a 20  tion to add */. 
78b0: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
78c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
78d0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
78e0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
78f0: 73 71 6c 69 74 65 5f 66 75 6e 63 2a 2c 69 6e 74  sqlite_func*,int
7900: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 2c 20  ,const char**), 
7910: 2f 2a 20 54 68 65 20 73 74 65 70 20 66 75 6e 63  /* The step func
7920: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28  tion */.  void (
7930: 2a 78 46 69 6e 61 6c 69 7a 65 29 28 73 71 6c 69  *xFinalize)(sqli
7940: 74 65 5f 66 75 6e 63 2a 29 2c 20 20 20 20 20 20  te_func*),      
7950: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
7960: 69 6e 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 76 6f  inalizer */.  vo
7970: 69 64 20 2a 70 55 73 65 72 44 61 74 61 20 20 20  id *pUserData   
7980: 20 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20     /* User data 
7990: 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  */.){.  FuncDef 
79a0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
79b0: 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c 20  .  if( db==0 || 
79c0: 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  zName==0 || sqli
79d0: 74 65 53 61 66 65 74 79 43 68 65 63 6b 28 64 62  teSafetyCheck(db
79e0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
79f0: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
7a00: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 4e 61  Name);.  if( nNa
7a10: 6d 65 3e 32 35 35 20 29 20 72 65 74 75 72 6e 20  me>255 ) return 
7a20: 31 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 46  1;.  p = sqliteF
7a30: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
7a40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  zName, nName, nA
7a50: 72 67 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 3d  rg, 1);.  if( p=
7a60: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
7a70: 20 70 2d 3e 78 46 75 6e 63 20 3d 20 30 3b 0a 20   p->xFunc = 0;. 
7a80: 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65   p->xStep = xSte
7a90: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
7aa0: 65 20 3d 20 78 46 69 6e 61 6c 69 7a 65 3b 0a 20  e = xFinalize;. 
7ab0: 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20   p->pUserData = 
7ac0: 70 55 73 65 72 44 61 74 61 3b 0a 20 20 72 65 74  pUserData;.  ret
7ad0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7ae0: 43 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 74  Change the datat
7af0: 79 70 65 20 66 6f 72 20 61 6c 6c 20 66 75 6e 63  ype for all func
7b00: 74 69 6f 6e 73 20 77 69 74 68 20 61 20 67 69 76  tions with a giv
7b10: 65 6e 20 6e 61 6d 65 2e 20 20 53 65 65 20 74 68  en name.  See th
7b20: 65 0a 2a 2a 20 68 65 61 64 65 72 20 63 6f 6d 6d  e.** header comm
7b30: 65 6e 74 20 66 6f 72 20 74 68 65 20 70 72 6f 74  ent for the prot
7b40: 6f 74 79 70 65 20 6f 66 20 74 68 69 73 20 66 75  otype of this fu
7b50: 6e 63 74 69 6f 6e 20 69 6e 20 73 71 6c 69 74 65  nction in sqlite
7b60: 2e 68 20 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69  .h for.** additi
7b70: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
7b80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f  ..*/.int sqlite_
7b90: 66 75 6e 63 74 69 6f 6e 5f 74 79 70 65 28 73 71  function_type(sq
7ba0: 6c 69 74 65 20 2a 64 62 2c 20 63 6f 6e 73 74 20  lite *db, const 
7bb0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
7bc0: 20 64 61 74 61 54 79 70 65 29 7b 0a 20 20 46 75   dataType){.  Fu
7bd0: 6e 63 44 65 66 20 2a 70 20 3d 20 28 46 75 6e 63  ncDef *p = (Func
7be0: 44 65 66 2a 29 73 71 6c 69 74 65 48 61 73 68 46  Def*)sqliteHashF
7bf0: 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20  ind(&db->aFunc, 
7c00: 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e  zName, strlen(zN
7c10: 61 6d 65 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  ame));.  while( 
7c20: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 64 61 74 61  p ){.    p->data
7c30: 54 79 70 65 20 3d 20 64 61 74 61 54 79 70 65 3b  Type = dataType;
7c40: 20 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65   .    p = p->pNe
7c50: 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
7c60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7c70: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
7c80: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
7c90: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
7ca0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
7cb0: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
7cc0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
7cd0: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
7ce0: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
7cf0: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
7d00: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
7d10: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
7d20: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
7d30: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
7d40: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
7d50: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
7d60: 65 61 63 68 0a 2a 2a 20 73 71 6c 69 74 65 5f 65  each.** sqlite_e
7d70: 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  xec()..*/.void *
7d80: 73 71 6c 69 74 65 5f 74 72 61 63 65 28 73 71 6c  sqlite_trace(sql
7d90: 69 74 65 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a  ite *db, void (*
7da0: 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f  xTrace)(void*,co
7db0: 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64  nst char*), void
7dc0: 20 2a 70 41 72 67 29 7b 0a 23 69 66 6e 64 65 66   *pArg){.#ifndef
7dd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
7de0: 43 45 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 20  CE.  void *pOld 
7df0: 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b  = db->pTraceArg;
7e00: 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
7e10: 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
7e20: 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
7e30: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 23    return pOld;.#
7e40: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
7e50: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
7e60: 20 52 65 67 69 73 74 65 72 20 66 75 6e 63 74 69   Register functi
7e70: 6f 6e 73 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ons to be invoke
7e80: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
7e90: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
7ea0: 6f 72 20 77 68 65 6e 0a 2a 2a 20 61 20 74 72 61  or when.** a tra
7eb0: 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
7ec0: 2e 20 20 49 66 20 65 69 74 68 65 72 20 66 75 6e  .  If either fun
7ed0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
7ee0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
7ef0: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
7f00: 67 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72  g operation abor
7f10: 74 73 20 77 69 74 68 20 61 20 63 6f 6e 73 74 72  ts with a constr
7f20: 61 69 6e 74 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76  aint error..*/.v
7f30: 6f 69 64 20 2a 73 71 6c 69 74 65 5f 62 65 67 69  oid *sqlite_begi
7f40: 6e 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  n_hook(.  sqlite
7f50: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 43   *db,.  int (*xC
7f60: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
7f70: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
7f80: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 20 3d 20  .  void *pOld = 
7f90: 64 62 2d 3e 70 42 65 67 69 6e 41 72 67 3b 0a 20  db->pBeginArg;. 
7fa0: 20 64 62 2d 3e 78 42 65 67 69 6e 43 61 6c 6c 62   db->xBeginCallb
7fb0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
7fc0: 0a 20 20 64 62 2d 3e 70 42 65 67 69 6e 41 72 67  .  db->pBeginArg
7fd0: 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75 72   = pArg;.  retur
7fe0: 6e 20 70 4f 6c 64 3b 0a 7d 0a 76 6f 69 64 20 2a  n pOld;.}.void *
7ff0: 73 71 6c 69 74 65 5f 63 6f 6d 6d 69 74 5f 68 6f  sqlite_commit_ho
8000: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  ok(.  sqlite *db
8010: 2c 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  ,.  int (*xCallb
8020: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76  ack)(void*),.  v
8030: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76  oid *pArg.){.  v
8040: 6f 69 64 20 2a 70 4f 6c 64 20 3d 20 64 62 2d 3e  oid *pOld = db->
8050: 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62  pCommitArg;.  db
8060: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
8070: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
8080: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20   db->pCommitArg 
8090: 3d 20 70 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  = pArg;.  return
80a0: 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOld;.}../*.** 
80b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
80c0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 73 71 6c 69  called when sqli
80d0: 74 65 20 77 61 6e 74 73 20 74 6f 20 6f 70 65 6e  te wants to open
80e0: 20 61 20 62 74 72 65 65 2e 20 20 7a 46 69 6c 65   a btree.  zFile
80f0: 6e 61 6d 65 20 69 73 0a 2a 2a 20 65 69 74 68 65  name is.** eithe
8100: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  r the name of a 
8110: 62 74 72 65 65 20 66 69 6c 65 20 6f 72 20 74 68  btree file or th
8120: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
8130: 65 6d 6f 72 79 3a 22 20 77 68 69 63 68 20 6f 70  emory:" which op
8140: 65 6e 73 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ens an.** in-mem
8150: 6f 72 79 20 62 74 72 65 65 20 6f 72 20 22 3a 74  ory btree or ":t
8160: 65 6d 70 3a 22 20 77 68 69 63 68 20 6f 70 65 6e  emp:" which open
8170: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 74  s a temporary bt
8180: 72 65 65 2e 20 54 68 69 73 20 6d 61 79 20 65 69  ree. This may ei
8190: 74 68 65 72 0a 2a 2a 20 62 65 20 69 6e 20 6d 65  ther.** be in me
81a0: 6d 6f 72 79 20 6f 72 20 62 61 63 6b 65 64 20 62  mory or backed b
81b0: 79 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  y a temporary fi
81c0: 6c 65 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  le depending on 
81d0: 72 75 6e 2d 74 69 6d 65 20 73 65 74 74 69 6e 67  run-time setting
81e0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
81f0: 42 74 72 65 65 46 61 63 74 6f 72 79 28 0a 20 20  BtreeFactory(.  
8200: 63 6f 6e 73 74 20 73 71 6c 69 74 65 20 2a 64 62  const sqlite *db
8210: 2c 09 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61  ,.    /* Main da
8220: 74 61 62 61 73 65 20 77 68 65 6e 20 6f 70 65 6e  tabase when open
8230: 69 6e 67 20 61 75 78 20 6f 74 68 65 72 77 69 73  ing aux otherwis
8240: 65 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  e 0 */.  const c
8250: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
8260: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
8270: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
8280: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
8290: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d  base */.  int om
82a0: 69 74 4a 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20  itJournal,      
82b0: 20 20 20 20 2f 2a 20 69 66 20 54 52 55 45 20 74      /* if TRUE t
82c0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6a 6f 75 72 6e  hen do not journ
82d0: 61 6c 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  al this file */.
82e0: 20 20 69 6e 74 20 6e 43 61 63 68 65 2c 20 20 20    int nCache,   
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
8300: 6f 77 20 6d 61 6e 79 20 70 61 67 65 73 20 69 6e  ow many pages in
8310: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
8320: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
8330: 74 72 65 65 29 7b 20 20 20 20 20 20 20 20 20 2f  tree){         /
8340: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
8350: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
8360: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 0a 20  itten here */.. 
8370: 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
8380: 6d 65 20 21 3d 20 30 20 29 3b 0a 20 20 61 73 73  me != 0 );.  ass
8390: 65 72 74 28 20 70 70 42 74 72 65 65 20 21 3d 20  ert( ppBtree != 
83a0: 30 29 3b 0a 0a 20 20 69 66 20 28 73 74 72 63 6d  0);..  if (strcm
83b0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
83c0: 65 6d 6f 72 79 3a 22 29 20 3d 3d 20 30 29 20 7b  emory:") == 0) {
83d0: 0a 20 20 20 20 69 66 20 28 41 4c 4c 4f 57 41 54  .    if (ALLOWAT
83e0: 54 41 43 48 4d 45 4d 29 20 7b 0a 20 20 20 20 20  TACHMEM) {.     
83f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 52 42   return sqliteRB
8400: 74 72 65 65 4f 70 65 6e 28 30 2c 20 30 2c 20 30  treeOpen(0, 0, 0
8410: 2c 20 70 70 42 74 72 65 65 29 3b 0a 20 20 20 20  , ppBtree);.    
8420: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
8430: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
8440: 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 7d  TOPEN;.    }.  }
8450: 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
8460: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 74 65  (zFilename, ":te
8470: 6d 70 3a 22 29 20 3d 3d 20 30 29 20 7b 0a 20 20  mp:") == 0) {.  
8480: 20 20 69 66 20 28 54 45 4d 50 44 42 49 4e 43 4f    if (TEMPDBINCO
8490: 52 45 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  RE == 0) {.     
84a0: 20 2f 2a 20 41 6c 77 61 79 73 20 75 73 65 20 66   /* Always use f
84b0: 69 6c 65 20 62 61 73 65 64 20 74 65 6d 70 6f 72  ile based tempor
84c0: 61 72 79 20 44 42 20 2a 2f 0a 20 20 20 20 20 20  ary DB */.      
84d0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 42 74 72  return sqliteBtr
84e0: 65 65 4f 70 65 6e 28 30 2c 20 6f 6d 69 74 4a 6f  eeOpen(0, omitJo
84f0: 75 72 6e 61 6c 2c 20 6e 43 61 63 68 65 2c 20 70  urnal, nCache, p
8500: 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d 20 65  pBtree);.    } e
8510: 6c 73 65 20 69 66 20 28 54 45 4d 50 44 42 49 4e  lse if (TEMPDBIN
8520: 43 4f 52 45 20 3d 3d 20 31 20 7c 7c 20 54 45 4d  CORE == 1 || TEM
8530: 50 44 42 49 4e 43 4f 52 45 20 3d 3d 20 32 29 20  PDBINCORE == 2) 
8540: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 77 69 74 63  {.      /* Switc
8550: 68 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 63  h depending on c
8560: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 61 6e 64 2f  ompile-time and/
8570: 6f 72 20 72 75 6e 74 69 6d 65 20 73 65 74 74 69  or runtime setti
8580: 6e 67 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ngs. */.      in
8590: 74 20 6c 6f 63 61 74 69 6f 6e 20 3d 20 64 62 2d  t location = db-
85a0: 3e 74 6d 70 64 62 5f 6c 6f 63 20 3d 3d 20 30 20  >tmpdb_loc == 0 
85b0: 3f 20 54 45 4d 50 44 42 49 4e 43 4f 52 45 20 3a  ? TEMPDBINCORE :
85c0: 20 64 62 2d 3e 74 6d 70 64 62 5f 6c 6f 63 3b 0a   db->tmpdb_loc;.
85d0: 0a 20 20 20 20 20 20 69 66 20 28 6c 6f 63 61 74  .      if (locat
85e0: 69 6f 6e 20 3d 3d 20 31 29 20 7b 0a 20 20 20 20  ion == 1) {.    
85f0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
8600: 65 42 74 72 65 65 4f 70 65 6e 28 7a 46 69 6c 65  eBtreeOpen(zFile
8610: 6e 61 6d 65 2c 20 6f 6d 69 74 4a 6f 75 72 6e 61  name, omitJourna
8620: 6c 2c 20 6e 43 61 63 68 65 2c 20 70 70 42 74 72  l, nCache, ppBtr
8630: 65 65 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  ee);.      } els
8640: 65 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e {.        retu
8650: 72 6e 20 73 71 6c 69 74 65 52 42 74 72 65 65 4f  rn sqliteRBtreeO
8660: 70 65 6e 28 30 2c 20 30 2c 20 30 2c 20 70 70 42  pen(0, 0, 0, ppB
8670: 74 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tree);.      }. 
8680: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
8690: 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 73 65 20    /* Always use 
86a0: 69 6e 2d 63 6f 72 65 20 44 42 20 2a 2f 0a 20 20  in-core DB */.  
86b0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
86c0: 65 52 42 74 72 65 65 4f 70 65 6e 28 30 2c 20 30  eRBtreeOpen(0, 0
86d0: 2c 20 30 2c 20 70 70 42 74 72 65 65 29 3b 0a 20  , 0, ppBtree);. 
86e0: 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
86f0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
8700: 65 42 74 72 65 65 4f 70 65 6e 28 7a 46 69 6c 65  eBtreeOpen(zFile
8710: 6e 61 6d 65 2c 20 6f 6d 69 74 4a 6f 75 72 6e 61  name, omitJourna
8720: 6c 2c 20 6e 43 61 63 68 65 2c 20 70 70 42 74 72  l, nCache, ppBtr
8730: 65 65 29 3b 0a 20 20 7d 0a 7d 0a                 ee);.  }.}.