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

Artifact ad3193c56da5acd31bc6cd48aa50dae1962d7c78:


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 30 39 20 32 30 30 33 2f 30 31  ,v 1.109 2003/01
0280: 2f 31 39 20 30 33 3a 35 39 3a 34 37 20 64 72 68  /19 03:59:47 drh
0290: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
02a0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02b0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22  .#include "os.h"
02c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
02d0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69  .h>../*.** A poi
02e0: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 73 74 72  nter to this str
02f0: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
0300: 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20 69 6e  o communicate in
0310: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 72 6f  formation.** fro
0320: 6d 20 73 71 6c 69 74 65 49 6e 69 74 20 69 6e 74  m sqliteInit int
0330: 6f 20 74 68 65 20 73 71 6c 69 74 65 49 6e 69 74  o the sqliteInit
0340: 43 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 74 79 70  Callback..*/.typ
0350: 65 64 65 66 20 73 74 72 75 63 74 20 7b 0a 20 20  edef struct {.  
0360: 73 71 6c 69 74 65 20 2a 64 62 3b 20 20 20 20 20  sqlite *db;     
0370: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
0380: 61 73 65 20 62 65 69 6e 67 20 69 6e 69 74 69 61  ase being initia
0390: 6c 69 7a 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  lized */.  char 
03a0: 2a 2a 70 7a 45 72 72 4d 73 67 3b 20 20 20 20 2f  **pzErrMsg;    /
03b0: 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
03c0: 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 7d  stored here */.}
03d0: 20 49 6e 69 74 44 61 74 61 3b 0a 0a 0a 2f 2a 0a   InitData;.../*.
03e0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63  ** This is the c
03f0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
0400: 66 6f 72 20 74 68 65 20 63 6f 64 65 20 74 68 61  for the code tha
0410: 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  t initializes th
0420: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20  e.** database.  
0430: 53 65 65 20 73 71 6c 69 74 65 49 6e 69 74 28 29  See sqliteInit()
0440: 20 62 65 6c 6f 77 20 66 6f 72 20 61 64 64 69 74   below for addit
0450: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
0460: 6e 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 63 61  n..**.** Each ca
0470: 6c 6c 62 61 63 6b 20 63 6f 6e 74 61 69 6e 73 20  llback contains 
0480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  the following in
0490: 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a  formation:.**.**
04a0: 20 20 20 20 20 61 72 67 76 5b 30 5d 20 3d 20 22       argv[0] = "
04b0: 66 69 6c 65 2d 66 6f 72 6d 61 74 22 20 6f 72 20  file-format" or 
04c0: 22 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 22 20  "schema-cookie" 
04d0: 6f 72 20 22 74 61 62 6c 65 22 20 6f 72 20 22 69  or "table" or "i
04e0: 6e 64 65 78 22 0a 2a 2a 20 20 20 20 20 61 72 67  ndex".**     arg
04f0: 76 5b 31 5d 20 3d 20 74 61 62 6c 65 20 6f 72 20  v[1] = table or 
0500: 69 6e 64 65 78 20 6e 61 6d 65 20 6f 72 20 6d 65  index name or me
0510: 74 61 20 73 74 61 74 65 6d 65 6e 74 20 74 79 70  ta statement typ
0520: 65 2e 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 32  e..**     argv[2
0530: 5d 20 3d 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  ] = root page nu
0540: 6d 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 6f  mber for table o
0550: 72 20 69 6e 64 65 78 2e 20 20 4e 55 4c 4c 20 66  r index.  NULL f
0560: 6f 72 20 6d 65 74 61 2e 0a 2a 2a 20 20 20 20 20  or meta..**     
0570: 61 72 67 76 5b 33 5d 20 3d 20 53 51 4c 20 74 65  argv[3] = SQL te
0580: 78 74 20 66 6f 72 20 61 20 43 52 45 41 54 45 20  xt for a CREATE 
0590: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
05a0: 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
05b0: 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 34 5d 20  .**     argv[4] 
05c0: 3d 20 22 31 22 20 66 6f 72 20 74 65 6d 70 6f 72  = "1" for tempor
05d0: 61 72 79 20 66 69 6c 65 73 2c 20 22 30 22 20 66  ary files, "0" f
05e0: 6f 72 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  or main database
05f0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 0a 69 6e  .**.*/.static.in
0600: 74 20 73 71 6c 69 74 65 49 6e 69 74 43 61 6c 6c  t sqliteInitCall
0610: 62 61 63 6b 28 76 6f 69 64 20 2a 70 49 6e 69 74  back(void *pInit
0620: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
0630: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
0640: 61 7a 43 6f 6c 4e 61 6d 65 29 7b 0a 20 20 49 6e  azColName){.  In
0650: 69 74 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  itData *pData = 
0660: 28 49 6e 69 74 44 61 74 61 2a 29 70 49 6e 69 74  (InitData*)pInit
0670: 3b 0a 20 20 50 61 72 73 65 20 73 50 61 72 73 65  ;.  Parse sParse
0680: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
0690: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f  ;..  /* TODO: Do
06a0: 20 73 6f 6d 65 20 76 61 6c 69 64 69 74 79 20 63   some validity c
06b0: 68 65 63 6b 73 20 6f 6e 20 61 6c 6c 20 66 69 65  hecks on all fie
06c0: 6c 64 73 2e 20 20 49 6e 20 70 61 72 74 69 63 75  lds.  In particu
06d0: 6c 61 72 2c 0a 20 20 2a 2a 20 6d 61 6b 65 20 73  lar,.  ** make s
06e0: 75 72 65 20 66 69 65 6c 64 73 20 64 6f 20 6e 6f  ure fields do no
06f0: 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 73 2e  t contain NULLs.
0700: 20 4f 74 68 65 72 77 69 73 65 20 77 65 20 6d 69   Otherwise we mi
0710: 67 68 74 20 63 6f 72 65 0a 20 20 2a 2a 20 77 68  ght core.  ** wh
0720: 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
0730: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 72 6f 6d   initialize from
0740: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
0750: 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 0a 20 20  ase file. */..  
0760: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 35 20  assert( argc==5 
0770: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 61 72 67  );.  switch( arg
0780: 76 5b 30 5d 5b 30 5d 20 29 7b 0a 20 20 20 20 63  v[0][0] ){.    c
0790: 61 73 65 20 27 76 27 3a 0a 20 20 20 20 63 61 73  ase 'v':.    cas
07a0: 65 20 27 69 27 3a 0a 20 20 20 20 63 61 73 65 20  e 'i':.    case 
07b0: 27 74 27 3a 20 7b 20 20 2f 2a 20 43 52 45 41 54  't': {  /* CREAT
07c0: 45 20 54 41 42 4c 45 2c 20 43 52 45 41 54 45 20  E TABLE, CREATE 
07d0: 49 4e 44 45 58 2c 20 6f 72 20 43 52 45 41 54 45  INDEX, or CREATE
07e0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 73   VIEW statements
07f0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61 72   */.      if( ar
0800: 67 76 5b 33 5d 20 26 26 20 61 72 67 76 5b 33 5d  gv[3] && argv[3]
0810: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  [0] ){.        /
0820: 2a 20 43 61 6c 6c 20 74 68 65 20 70 61 72 73 65  * Call the parse
0830: 72 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 43  r to process a C
0840: 52 45 41 54 45 20 54 41 42 4c 45 2c 20 49 4e 44  REATE TABLE, IND
0850: 45 58 20 6f 72 20 56 49 45 57 2e 0a 20 20 20 20  EX or VIEW..    
0860: 20 20 20 20 2a 2a 20 42 75 74 20 62 65 63 61 75      ** But becau
0870: 73 65 20 73 50 61 72 73 65 2e 69 6e 69 74 46 6c  se sParse.initFl
0880: 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
0890: 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 69 73 20  no VDBE code is 
08a0: 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 20 20  generated.      
08b0: 20 20 2a 2a 20 6f 72 20 65 78 65 63 75 74 65 64    ** or executed
08c0: 2e 20 20 41 6c 6c 20 74 68 65 20 70 61 72 73 65  .  All the parse
08d0: 72 20 64 6f 65 73 20 69 73 20 62 75 69 6c 64 20  r does is build 
08e0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  the internal dat
08f0: 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 72  a.        ** str
0900: 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65 73  uctures that des
0910: 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65 2c  cribe the table,
0920: 20 69 6e 64 65 78 2c 20 6f 72 20 76 69 65 77 2e   index, or view.
0930: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
0940: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 61 72      memset(&sPar
0950: 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 50  se, 0, sizeof(sP
0960: 61 72 73 65 29 29 3b 0a 20 20 20 20 20 20 20 20  arse));.        
0970: 73 50 61 72 73 65 2e 64 62 20 3d 20 70 44 61 74  sParse.db = pDat
0980: 61 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 73  a->db;.        s
0990: 50 61 72 73 65 2e 69 6e 69 74 46 6c 61 67 20 3d  Parse.initFlag =
09a0: 20 31 3b 0a 20 20 20 20 20 20 20 20 73 50 61 72   1;.        sPar
09b0: 73 65 2e 69 73 54 65 6d 70 20 3d 20 61 72 67 76  se.isTemp = argv
09c0: 5b 34 5d 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  [4][0] - '0';.  
09d0: 20 20 20 20 20 20 73 50 61 72 73 65 2e 6e 65 77        sParse.new
09e0: 54 6e 75 6d 20 3d 20 61 74 6f 69 28 61 72 67 76  Tnum = atoi(argv
09f0: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [2]);.        sq
0a00: 6c 69 74 65 52 75 6e 50 61 72 73 65 72 28 26 73  liteRunParser(&s
0a10: 50 61 72 73 65 2c 20 61 72 67 76 5b 33 5d 2c 20  Parse, argv[3], 
0a20: 70 44 61 74 61 2d 3e 70 7a 45 72 72 4d 73 67 29  pData->pzErrMsg)
0a30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
0a40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
0a50: 20 53 51 4c 20 63 6f 6c 75 6d 6e 20 69 73 20 62   SQL column is b
0a60: 6c 61 6e 6b 20 69 74 20 6d 65 61 6e 73 20 74 68  lank it means th
0a70: 69 73 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74  is is an index t
0a80: 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  hat.        ** w
0a90: 61 73 20 63 72 65 61 74 65 64 20 74 6f 20 62 65  as created to be
0aa0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
0ab0: 20 6f 72 20 74 6f 20 66 75 6c 66 69 6c 6c 20 61   or to fulfill a
0ac0: 20 55 4e 49 51 55 45 0a 20 20 20 20 20 20 20 20   UNIQUE.        
0ad0: 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  ** constraint fo
0ae0: 72 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  r a CREATE TABLE
0af0: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 73 68 6f  .  The index sho
0b00: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
0b10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 65 6e  .        ** been
0b20: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 77 65   created when we
0b30: 20 70 72 6f 63 65 73 73 65 64 20 74 68 65 20 43   processed the C
0b40: 52 45 41 54 45 20 54 41 42 4c 45 2e 20 20 41 6c  REATE TABLE.  Al
0b50: 6c 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  l we have.      
0b60: 20 20 2a 2a 20 74 6f 20 64 6f 20 68 65 72 65 20    ** to do here 
0b70: 69 73 20 72 65 63 6f 72 64 20 74 68 65 20 72 6f  is record the ro
0b80: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot page number f
0b90: 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 0a 20  or that index.. 
0ba0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
0bb0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
0bc0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65  = sqliteFindInde
0bd0: 78 28 70 44 61 74 61 2d 3e 64 62 2c 20 61 72 67  x(pData->db, arg
0be0: 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  v[1]);.        i
0bf0: 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 7c 7c 20  f( pIndex==0 || 
0c00: 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 21 3d 30 20  pIndex->tnum!=0 
0c10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
0c20: 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69  This can occur i
0c30: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
0c40: 6e 20 69 6e 64 65 78 20 6f 6e 20 61 20 54 45 4d  n index on a TEM
0c50: 50 20 74 61 62 6c 65 20 77 68 69 63 68 0a 20 20  P table which.  
0c60: 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 74          ** has t
0c70: 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
0c80: 61 6e 6f 74 68 65 72 20 69 6e 64 65 78 20 6f 6e  another index on
0c90: 20 61 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64   a permanent ind
0ca0: 65 78 2e 20 20 53 69 6e 63 65 0a 20 20 20 20 20  ex.  Since.     
0cb0: 20 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 6d       ** the perm
0cc0: 61 6e 65 6e 74 20 74 61 62 6c 65 20 69 73 20 68  anent table is h
0cd0: 69 64 64 65 6e 20 62 79 20 74 68 65 20 54 45 4d  idden by the TEM
0ce0: 50 20 74 61 62 6c 65 2c 20 77 65 20 63 61 6e 20  P table, we can 
0cf0: 61 6c 73 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  also.          *
0d00: 2a 20 73 61 66 65 6c 79 20 69 67 6e 6f 72 65 20  * safely ignore 
0d10: 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 68 65  the index on the
0d20: 20 70 65 72 6d 61 6e 65 6e 74 20 74 61 62 6c 65   permanent table
0d30: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
0d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 4e           /* Do N
0d50: 6f 74 68 69 6e 67 20 2a 2f 3b 0a 20 20 20 20 20  othing */;.     
0d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d70: 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
0d80: 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 32 5d 29   = atoi(argv[2])
0d90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0da0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
0db0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
0dc0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  lt: {.      /* T
0dd0: 68 69 73 20 63 61 6e 20 6e 6f 74 20 68 61 70 70  his can not happ
0de0: 65 6e 21 20 2a 2f 0a 20 20 20 20 20 20 6e 45 72  en! */.      nEr
0df0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  r = 1;.      ass
0e00: 65 72 74 28 20 6e 45 72 72 3d 3d 30 20 29 3b 0a  ert( nErr==0 );.
0e10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
0e20: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nErr;.}../*.*
0e30: 2a 20 54 68 69 73 20 69 73 20 61 20 63 61 6c 6c  * This is a call
0e40: 62 61 63 6b 20 70 72 6f 63 65 64 75 72 65 20 75  back procedure u
0e50: 73 65 64 20 74 6f 20 72 65 63 6f 6e 73 74 72 75  sed to reconstru
0e60: 63 74 20 61 20 74 61 62 6c 65 2e 20 20 54 68 65  ct a table.  The
0e70: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
0e80: 74 61 62 6c 65 20 74 6f 20 62 65 20 72 65 63 6f  table to be reco
0e90: 6e 73 74 72 75 63 74 65 64 20 69 73 20 70 61 73  nstructed is pas
0ea0: 73 65 64 20 69 6e 20 61 73 20 61 72 67 76 5b 30  sed in as argv[0
0eb0: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ]..**.** This ro
0ec0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
0ed0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75   automatically u
0ee0: 70 67 72 61 64 65 20 61 20 64 61 74 61 62 61 73  pgrade a databas
0ef0: 65 20 66 72 6f 6d 0a 2a 2a 20 66 6f 72 6d 61 74  e from.** format
0f00: 20 76 65 72 73 69 6f 6e 20 31 20 6f 72 20 32 20   version 1 or 2 
0f10: 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 20 20 54  to version 3.  T
0f20: 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  he correct opera
0f30: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 69 73 20  tion of.** this 
0f40: 72 6f 75 74 69 6e 65 20 72 65 6c 79 73 20 6f 6e  routine relys on
0f50: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 6e   the fact that n
0f60: 6f 20 69 6e 64 69 63 65 73 20 61 72 65 20 75 73  o indices are us
0f70: 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 70 79 69  ed when.** copyi
0f80: 6e 67 20 61 20 74 61 62 6c 65 20 6f 75 74 20 74  ng a table out t
0f90: 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  o a temporary fi
0fa0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 0a 69 6e  le..*/.static.in
0fb0: 74 20 75 70 67 72 61 64 65 5f 33 5f 63 61 6c 6c  t upgrade_3_call
0fc0: 62 61 63 6b 28 76 6f 69 64 20 2a 70 49 6e 69 74  back(void *pInit
0fd0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
0fe0: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
0ff0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 49 6e 69 74  NotUsed){.  Init
1000: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 28 49  Data *pData = (I
1010: 6e 69 74 44 61 74 61 2a 29 70 49 6e 69 74 3b 0a  nitData*)pInit;.
1020: 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 61 62 6c    int rc;.  Tabl
1030: 65 20 2a 70 54 61 62 3b 0a 20 20 54 72 69 67 67  e *pTab;.  Trigg
1040: 65 72 20 2a 70 54 72 69 67 3b 0a 20 20 63 68 61  er *pTrig;.  cha
1050: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20  r *zErr = 0;..  
1060: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46 69 6e  pTab = sqliteFin
1070: 64 54 61 62 6c 65 28 70 44 61 74 61 2d 3e 64 62  dTable(pData->db
1080: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 61 73  , argv[0]);.  as
1090: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
10a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10b0: 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 7a  eStrICmp(pTab->z
10c0: 4e 61 6d 65 2c 20 61 72 67 76 5b 30 5d 29 3d 3d  Name, argv[0])==
10d0: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  0 );.  if( pTab 
10e0: 29 7b 0a 20 20 20 20 70 54 72 69 67 20 3d 20 70  ){.    pTrig = p
10f0: 54 61 62 2d 3e 70 54 72 69 67 67 65 72 3b 0a 20  Tab->pTrigger;. 
1100: 20 20 20 70 54 61 62 2d 3e 70 54 72 69 67 67 65     pTab->pTrigge
1110: 72 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62  r = 0;  /* Disab
1120: 6c 65 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  le all triggers 
1130: 62 65 66 6f 72 65 20 72 65 62 75 69 6c 64 69 6e  before rebuildin
1140: 67 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  g the table */. 
1150: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1160: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 70 44 61  _exec_printf(pDa
1170: 74 61 2d 3e 64 62 2c 0a 20 20 20 20 22 43 52 45  ta->db,.    "CRE
1180: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73  ATE TEMP TABLE s
1190: 71 6c 69 74 65 5f 78 20 41 53 20 53 45 4c 45 43  qlite_x AS SELEC
11a0: 54 20 2a 20 46 52 4f 4d 20 27 25 71 27 3b 20 22  T * FROM '%q'; "
11b0: 0a 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f  .    "DELETE FRO
11c0: 4d 20 27 25 71 27 3b 20 22 0a 20 20 20 20 22 49  M '%q'; ".    "I
11d0: 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27 20  NSERT INTO '%q' 
11e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
11f0: 6c 69 74 65 5f 78 3b 20 22 0a 20 20 20 20 22 44  lite_x; ".    "D
1200: 52 4f 50 20 54 41 42 4c 45 20 73 71 6c 69 74 65  ROP TABLE sqlite
1210: 5f 78 3b 22 2c 0a 20 20 20 20 30 2c 20 30 2c 20  _x;",.    0, 0, 
1220: 26 7a 45 72 72 2c 20 61 72 67 76 5b 30 5d 2c 20  &zErr, argv[0], 
1230: 61 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 30 5d  argv[0], argv[0]
1240: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
1250: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
1260: 72 69 6e 67 28 70 44 61 74 61 2d 3e 70 7a 45 72  ring(pData->pzEr
1270: 72 4d 73 67 2c 20 7a 45 72 72 2c 20 30 29 3b 0a  rMsg, zErr, 0);.
1280: 20 20 20 20 73 71 6c 69 74 65 5f 66 72 65 65 6d      sqlite_freem
1290: 65 6d 28 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a 20  em(zErr);.  }.. 
12a0: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
12b0: 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68 65 20  occurred in the 
12c0: 53 51 4c 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  SQL above, then 
12d0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12e0: 77 69 6c 6c 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  will.  ** rollba
12f0: 63 6b 20 77 68 69 63 68 20 77 69 6c 6c 20 64 65  ck which will de
1300: 6c 65 74 65 20 74 68 65 20 69 6e 74 65 72 6e 61  lete the interna
1310: 6c 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 73 2e  l symbol tables.
1320: 20 20 54 68 69 73 20 77 69 6c 6c 0a 20 20 2a 2a    This will.  **
1330: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 75 63   cause the struc
1340: 74 75 72 65 20 74 68 61 74 20 70 54 61 62 20 70  ture that pTab p
1350: 6f 69 6e 74 73 20 74 6f 20 62 65 20 64 65 6c 65  oints to be dele
1360: 74 65 64 2e 20 20 49 6e 20 63 61 73 65 20 74 68  ted.  In case th
1370: 61 74 0a 20 20 2a 2a 20 68 61 70 70 65 6e 65 64  at.  ** happened
1380: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 66  , we need to ref
1390: 65 74 63 68 20 70 54 61 62 2e 0a 20 20 2a 2f 0a  etch pTab..  */.
13a0: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 46    pTab = sqliteF
13b0: 69 6e 64 54 61 62 6c 65 28 70 44 61 74 61 2d 3e  indTable(pData->
13c0: 64 62 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  db, argv[0]);.  
13d0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
13e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 53 74  assert( sqliteSt
13f0: 72 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  rICmp(pTab->zNam
1400: 65 2c 20 61 72 67 76 5b 30 5d 29 3d 3d 30 20 29  e, argv[0])==0 )
1410: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 70 54 72 69  ;.    pTab->pTri
1420: 67 67 65 72 20 3d 20 70 54 72 69 67 3b 20 20 2f  gger = pTrig;  /
1430: 2a 20 52 65 2d 65 6e 61 62 6c 65 20 74 72 69 67  * Re-enable trig
1440: 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  gers */.  }.  re
1450: 74 75 72 6e 20 72 63 21 3d 53 51 4c 49 54 45 5f  turn rc!=SQLITE_
1460: 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41  OK;.}..../*.** A
1470: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
1480: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1490: 6d 61 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ma and initializ
14a0: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 64 61  e internal.** da
14b0: 74 61 20 73 74 72 75 63 74 75 72 65 73 2e 20 20  ta structures.  
14c0: 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68  Return one of th
14d0: 65 20 53 51 4c 49 54 45 5f 20 65 72 72 6f 72 20  e SQLITE_ error 
14e0: 63 6f 64 65 73 20 74 6f 0a 2a 2a 20 69 6e 64 69  codes to.** indi
14f0: 63 61 74 65 20 73 75 63 63 65 73 73 20 6f 72 20  cate success or 
1500: 66 61 69 6c 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 41  failure..**.** A
1510: 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
1520: 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1530: 2c 20 74 68 65 20 53 51 4c 49 54 45 5f 49 6e 69  , the SQLITE_Ini
1540: 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 62 69 74 20  tialized.** bit 
1550: 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 66 6c  is set in the fl
1560: 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
1570: 20 73 71 6c 69 74 65 20 73 74 72 75 63 74 75 72   sqlite structur
1580: 65 2e 20 20 41 6e 0a 2a 2a 20 61 74 74 65 6d 70  e.  An.** attemp
1590: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 69 6e 69  t is made to ini
15a0: 74 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  tialize the data
15b0: 62 61 73 65 20 61 73 20 73 6f 6f 6e 20 61 73 20  base as soon as 
15c0: 69 74 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 2e  it.** is opened.
15d0: 20 20 49 66 20 74 68 61 74 20 66 61 69 6c 73 20    If that fails 
15e0: 28 70 65 72 68 61 70 73 20 62 65 63 61 75 73 65  (perhaps because
15f0: 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
1600: 0a 2a 2a 20 68 61 73 20 74 68 65 20 73 71 6c 69  .** has the sqli
1610: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
1620: 6c 6f 63 6b 65 64 29 20 74 68 61 6e 20 61 6e 6f  locked) than ano
1630: 74 68 65 72 20 61 74 74 65 6d 70 74 0a 2a 2a 20  ther attempt.** 
1640: 69 73 20 6d 61 64 65 20 74 68 65 20 66 69 72 73  is made the firs
1650: 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
1660: 61 73 65 20 69 73 20 61 63 63 65 73 73 65 64 2e  ase is accessed.
1670: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 49 6e  .*/.int sqliteIn
1680: 69 74 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63  it(sqlite *db, c
1690: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b  har **pzErrMsg){
16a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
16b0: 75 72 73 6f 72 20 2a 63 75 72 4d 61 69 6e 3b 0a  ursor *curMain;.
16c0: 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 54 61    int size;.  Ta
16d0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 63 68 61  ble *pTab;.  cha
16e0: 72 20 2a 61 7a 41 72 67 5b 36 5d 3b 0a 20 20 69  r *azArg[6];.  i
16f0: 6e 74 20 6d 65 74 61 5b 53 51 4c 49 54 45 5f 4e  nt meta[SQLITE_N
1700: 5f 42 54 52 45 45 5f 4d 45 54 41 5d 3b 0a 20 20  _BTREE_META];.  
1710: 50 61 72 73 65 20 73 50 61 72 73 65 3b 0a 20 20  Parse sParse;.  
1720: 49 6e 69 74 44 61 74 61 20 69 6e 69 74 44 61 74  InitData initDat
1730: 61 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  a;..  /*.  ** Th
1740: 65 20 6d 61 73 74 65 72 20 64 61 74 61 62 61 73  e master databas
1750: 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 73 74  e table has a st
1760: 72 75 63 74 75 72 65 20 6c 69 6b 65 20 74 68 69  ructure like thi
1770: 73 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  s.  */.  static 
1780: 63 68 61 72 20 6d 61 73 74 65 72 5f 73 63 68 65  char master_sche
1790: 6d 61 5b 5d 20 3d 20 0a 20 20 20 20 20 22 43 52  ma[] = .     "CR
17a0: 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74  EATE TABLE sqlit
17b0: 65 5f 6d 61 73 74 65 72 28 5c 6e 22 0a 20 20 20  e_master(\n".   
17c0: 20 20 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c    "  type text,\
17d0: 6e 22 0a 20 20 20 20 20 22 20 20 6e 61 6d 65 20  n".     "  name 
17e0: 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 22 20  text,\n".     " 
17f0: 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c   tbl_name text,\
1800: 6e 22 0a 20 20 20 20 20 22 20 20 72 6f 6f 74 70  n".     "  rootp
1810: 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a  age integer,\n".
1820: 20 20 20 20 20 22 20 20 73 71 6c 20 74 65 78 74       "  sql text
1830: 5c 6e 22 0a 20 20 20 20 20 22 29 22 0a 20 20 3b  \n".     ")".  ;
1840: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 74  .  static char t
1850: 65 6d 70 5f 6d 61 73 74 65 72 5f 73 63 68 65 6d  emp_master_schem
1860: 61 5b 5d 20 3d 20 0a 20 20 20 20 20 22 43 52 45  a[] = .     "CRE
1870: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73  ATE TEMP TABLE s
1880: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
1890: 72 28 5c 6e 22 0a 20 20 20 20 20 22 20 20 74 79  r(\n".     "  ty
18a0: 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  pe text,\n".    
18b0: 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e   "  name text,\n
18c0: 22 0a 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61  ".     "  tbl_na
18d0: 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  me text,\n".    
18e0: 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74   "  rootpage int
18f0: 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 22 20  eger,\n".     " 
1900: 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20   sql text\n".   
1910: 20 20 22 29 22 0a 20 20 3b 0a 0a 20 20 2f 2a 20    ")".  ;..  /* 
1920: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  The following SQ
1930: 4c 20 77 69 6c 6c 20 72 65 61 64 20 74 68 65 20  L will read the 
1940: 73 63 68 65 6d 61 20 66 72 6f 6d 20 74 68 65 20  schema from the 
1950: 6d 61 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20  master tables.. 
1960: 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 65   ** The first ve
1970: 72 73 69 6f 6e 20 77 6f 72 6b 73 20 77 69 74 68  rsion works with
1980: 20 53 51 4c 69 74 65 20 66 69 6c 65 20 66 6f 72   SQLite file for
1990: 6d 61 74 73 20 32 20 6f 72 20 67 72 65 61 74 65  mats 2 or greate
19a0: 72 2e 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  r..  ** The seco
19b0: 6e 64 20 76 65 72 73 69 6f 6e 20 69 73 20 66 6f  nd version is fo
19c0: 72 20 66 6f 72 6d 61 74 20 31 20 66 69 6c 65 73  r format 1 files
19d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 67 69  ..  **.  ** Begi
19e0: 6e 6e 69 6e 67 20 77 69 74 68 20 66 69 6c 65 20  nning with file 
19f0: 66 6f 72 6d 61 74 20 32 2c 20 74 68 65 20 72 6f  format 2, the ro
1a00: 77 69 64 20 66 6f 72 20 6e 65 77 20 74 61 62 6c  wid for new tabl
1a10: 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 28  e entries.  ** (
1a20: 69 6e 63 6c 75 64 69 6e 67 20 65 6e 74 72 69 65  including entrie
1a30: 73 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  s in sqlite_mast
1a40: 65 72 29 20 69 73 20 61 6e 20 69 6e 63 72 65 61  er) is an increa
1a50: 73 69 6e 67 20 69 6e 74 65 67 65 72 2e 0a 20 20  sing integer..  
1a60: 2a 2a 20 53 6f 20 66 6f 72 20 66 69 6c 65 20 66  ** So for file f
1a70: 6f 72 6d 61 74 20 32 20 61 6e 64 20 6c 61 74 65  ormat 2 and late
1a80: 72 2c 20 77 65 20 63 61 6e 20 70 6c 61 79 20 62  r, we can play b
1a90: 61 63 6b 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ack sqlite_maste
1aa0: 72 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 20 74  r.  ** and all t
1ab0: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
1ac0: 65 6e 74 73 20 77 69 6c 6c 20 61 70 70 65 61 72  ents will appear
1ad0: 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
1ae0: 64 65 72 2e 0a 20 20 2a 2a 20 42 75 74 20 77 69  der..  ** But wi
1af0: 74 68 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 31  th file format 1
1b00: 2c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  , table entries 
1b10: 77 65 72 65 20 72 61 6e 64 6f 6d 20 61 6e 64 20  were random and 
1b20: 73 6f 20 77 65 0a 20 20 2a 2a 20 68 61 76 65 20  so we.  ** have 
1b30: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
1b40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 73 20 6f   CREATE TABLEs o
1b50: 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 69  ccur before thei
1b60: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  r corresponding.
1b70: 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45    ** CREATE INDE
1b80: 58 73 2e 20 20 28 57 65 20 64 6f 6e 27 74 20 68  Xs.  (We don't h
1b90: 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ave to deal with
1ba0: 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 72 0a   CREATE VIEW or.
1bb0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 52 49 47    ** CREATE TRIG
1bc0: 47 45 52 20 69 6e 20 66 69 6c 65 20 66 6f 72 6d  GER in file form
1bd0: 61 74 20 31 20 62 65 63 61 75 73 65 20 74 68 6f  at 1 because tho
1be0: 73 65 20 63 6f 6e 73 74 72 75 63 74 73 20 64 69  se constructs di
1bf0: 64 0a 20 20 2a 2a 20 6e 6f 74 20 65 78 69 73 74  d.  ** not exist
1c00: 20 74 68 65 6e 2e 29 20 0a 20 20 2a 2f 0a 20 20   then.) .  */.  
1c10: 73 74 61 74 69 63 20 63 68 61 72 20 69 6e 69 74  static char init
1c20: 5f 73 63 72 69 70 74 5b 5d 20 3d 20 0a 20 20 20  _script[] = .   
1c30: 20 20 22 53 45 4c 45 43 54 20 74 79 70 65 2c 20    "SELECT type, 
1c40: 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20  name, rootpage, 
1c50: 73 71 6c 2c 20 31 20 46 52 4f 4d 20 73 71 6c 69  sql, 1 FROM sqli
1c60: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 22  te_temp_master "
1c70: 0a 20 20 20 20 20 22 55 4e 49 4f 4e 20 41 4c 4c  .     "UNION ALL
1c80: 20 22 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20   ".     "SELECT 
1c90: 74 79 70 65 2c 20 6e 61 6d 65 2c 20 72 6f 6f 74  type, name, root
1ca0: 70 61 67 65 2c 20 73 71 6c 2c 20 30 20 46 52 4f  page, sql, 0 FRO
1cb0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
1cc0: 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
1cd0: 6f 6c 64 65 72 5f 69 6e 69 74 5f 73 63 72 69 70  older_init_scrip
1ce0: 74 5b 5d 20 3d 20 0a 20 20 20 20 20 22 53 45 4c  t[] = .     "SEL
1cf0: 45 43 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20  ECT type, name, 
1d00: 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 2c 20 31  rootpage, sql, 1
1d10: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
1d20: 70 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  p_master ".     
1d30: 22 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20  "UNION ALL ".   
1d40: 20 20 22 53 45 4c 45 43 54 20 74 79 70 65 2c 20    "SELECT type, 
1d50: 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65 2c 20  name, rootpage, 
1d60: 73 71 6c 2c 20 30 20 46 52 4f 4d 20 73 71 6c 69  sql, 0 FROM sqli
1d70: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
1d80: 20 22 57 48 45 52 45 20 74 79 70 65 3d 27 74 61   "WHERE type='ta
1d90: 62 6c 65 27 20 22 0a 20 20 20 20 20 22 55 4e 49  ble' ".     "UNI
1da0: 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 22 53  ON ALL ".     "S
1db0: 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d 65  ELECT type, name
1dc0: 2c 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 2c  , rootpage, sql,
1dd0: 20 30 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   0 FROM sqlite_m
1de0: 61 73 74 65 72 20 22 0a 20 20 20 20 20 22 57 48  aster ".     "WH
1df0: 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
1e00: 22 3b 0a 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  ";...  /* Constr
1e10: 75 63 74 20 74 68 65 20 73 63 68 65 6d 61 20 74  uct the schema t
1e20: 61 62 6c 65 73 3a 20 73 71 6c 69 74 65 5f 6d 61  ables: sqlite_ma
1e30: 73 74 65 72 20 61 6e 64 20 73 71 6c 69 74 65 5f  ster and sqlite_
1e40: 74 65 6d 70 5f 6d 61 73 74 65 72 0a 20 20 2a 2f  temp_master.  */
1e50: 0a 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 22 74  .  azArg[0] = "t
1e60: 61 62 6c 65 22 3b 0a 20 20 61 7a 41 72 67 5b 31  able";.  azArg[1
1e70: 5d 20 3d 20 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  ] = MASTER_NAME;
1e80: 0a 20 20 61 7a 41 72 67 5b 32 5d 20 3d 20 22 32  .  azArg[2] = "2
1e90: 22 3b 0a 20 20 61 7a 41 72 67 5b 33 5d 20 3d 20  ";.  azArg[3] = 
1ea0: 6d 61 73 74 65 72 5f 73 63 68 65 6d 61 3b 0a 20  master_schema;. 
1eb0: 20 61 7a 41 72 67 5b 34 5d 20 3d 20 22 30 22 3b   azArg[4] = "0";
1ec0: 0a 20 20 61 7a 41 72 67 5b 35 5d 20 3d 20 30 3b  .  azArg[5] = 0;
1ed0: 0a 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20 3d  .  initData.db =
1ee0: 20 64 62 3b 0a 20 20 69 6e 69 74 44 61 74 61 2e   db;.  initData.
1ef0: 70 7a 45 72 72 4d 73 67 20 3d 20 70 7a 45 72 72  pzErrMsg = pzErr
1f00: 4d 73 67 3b 0a 20 20 73 71 6c 69 74 65 49 6e 69  Msg;.  sqliteIni
1f10: 74 43 61 6c 6c 62 61 63 6b 28 26 69 6e 69 74 44  tCallback(&initD
1f20: 61 74 61 2c 20 35 2c 20 61 7a 41 72 67 2c 20 30  ata, 5, azArg, 0
1f30: 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
1f40: 74 65 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  teFindTable(db, 
1f50: 4d 41 53 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20  MASTER_NAME);.  
1f60: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
1f70: 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  pTab->readOnly =
1f80: 20 31 3b 0a 20 20 7d 0a 20 20 61 7a 41 72 67 5b   1;.  }.  azArg[
1f90: 31 5d 20 3d 20 54 45 4d 50 5f 4d 41 53 54 45 52  1] = TEMP_MASTER
1fa0: 5f 4e 41 4d 45 3b 0a 20 20 61 7a 41 72 67 5b 33  _NAME;.  azArg[3
1fb0: 5d 20 3d 20 74 65 6d 70 5f 6d 61 73 74 65 72 5f  ] = temp_master_
1fc0: 73 63 68 65 6d 61 3b 0a 20 20 61 7a 41 72 67 5b  schema;.  azArg[
1fd0: 34 5d 20 3d 20 22 31 22 3b 0a 20 20 73 71 6c 69  4] = "1";.  sqli
1fe0: 74 65 49 6e 69 74 43 61 6c 6c 62 61 63 6b 28 26  teInitCallback(&
1ff0: 69 6e 69 74 44 61 74 61 2c 20 35 2c 20 61 7a 41  initData, 5, azA
2000: 72 67 2c 20 30 29 3b 0a 20 20 70 54 61 62 20 3d  rg, 0);.  pTab =
2010: 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62 6c 65   sqliteFindTable
2020: 28 64 62 2c 20 54 45 4d 50 5f 4d 41 53 54 45 52  (db, TEMP_MASTER
2030: 5f 4e 41 4d 45 29 3b 0a 20 20 69 66 28 20 70 54  _NAME);.  if( pT
2040: 61 62 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  ab ){.    pTab->
2050: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
2060: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61  }..  /* Create a
2070: 20 63 75 72 73 6f 72 20 74 6f 20 68 6f 6c 64 20   cursor to hold 
2080: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
2090: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  n.  */.  if( db-
20a0: 3e 70 42 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  >pBe==0 ) return
20b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63   SQLITE_OK;.  rc
20c0: 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 43 75   = sqliteBtreeCu
20d0: 72 73 6f 72 28 64 62 2d 3e 70 42 65 2c 20 32 2c  rsor(db->pBe, 2,
20e0: 20 30 2c 20 26 63 75 72 4d 61 69 6e 29 3b 0a 20   0, &curMain);. 
20f0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
2100: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70  qliteSetString(p
2110: 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 5f  zErrMsg, sqlite_
2120: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72 63 29  error_string(rc)
2130: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2140: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
2150: 65 6d 61 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ema(db);.    ret
2160: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2170: 2a 20 47 65 74 20 74 68 65 20 64 61 74 61 62 61  * Get the databa
2180: 73 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  se meta informat
2190: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ion.  */.  rc = 
21a0: 73 71 6c 69 74 65 42 74 72 65 65 47 65 74 4d 65  sqliteBtreeGetMe
21b0: 74 61 28 64 62 2d 3e 70 42 65 2c 20 6d 65 74 61  ta(db->pBe, meta
21c0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
21d0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
21e0: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c  ng(pzErrMsg, sql
21f0: 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ite_error_string
2200: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 73 71  (rc), 0);.    sq
2210: 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61  liteResetInterna
2220: 6c 53 63 68 65 6d 61 28 64 62 29 3b 0a 20 20 20  lSchema(db);.   
2230: 20 73 71 6c 69 74 65 42 74 72 65 65 43 6c 6f 73   sqliteBtreeClos
2240: 65 43 75 72 73 6f 72 28 63 75 72 4d 61 69 6e 29  eCursor(curMain)
2250: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2260: 0a 20 20 7d 0a 20 20 64 62 2d 3e 73 63 68 65 6d  .  }.  db->schem
2270: 61 5f 63 6f 6f 6b 69 65 20 3d 20 6d 65 74 61 5b  a_cookie = meta[
2280: 31 5d 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 5f 63  1];.  db->next_c
2290: 6f 6f 6b 69 65 20 3d 20 64 62 2d 3e 73 63 68 65  ookie = db->sche
22a0: 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 64 62 2d  ma_cookie;.  db-
22b0: 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 6d  >file_format = m
22c0: 65 74 61 5b 32 5d 3b 0a 20 20 73 69 7a 65 20 3d  eta[2];.  size =
22d0: 20 6d 65 74 61 5b 33 5d 3b 0a 20 20 69 66 28 20   meta[3];.  if( 
22e0: 73 69 7a 65 3d 3d 30 20 29 7b 20 73 69 7a 65 20  size==0 ){ size 
22f0: 3d 20 4d 41 58 5f 50 41 47 45 53 3b 20 7d 0a 20  = MAX_PAGES; }. 
2300: 20 64 62 2d 3e 63 61 63 68 65 5f 73 69 7a 65 20   db->cache_size 
2310: 3d 20 73 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65  = size;.  sqlite
2320: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
2330: 65 28 64 62 2d 3e 70 42 65 2c 20 73 69 7a 65 29  e(db->pBe, size)
2340: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20  ;..  /*.  **    
2350: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 31 20   file_format==1 
2360: 20 20 20 56 65 72 73 69 6f 6e 20 32 2e 31 2e 30     Version 2.1.0
2370: 2e 0a 20 20 2a 2a 20 20 20 20 20 66 69 6c 65 5f  ..  **     file_
2380: 66 6f 72 6d 61 74 3d 3d 32 20 20 20 20 56 65 72  format==2    Ver
2390: 73 69 6f 6e 20 32 2e 32 2e 30 2e 20 41 64 64 20  sion 2.2.0. Add 
23a0: 73 75 70 70 6f 72 74 20 66 6f 72 20 49 4e 54 45  support for INTE
23b0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
23c0: 0a 20 20 2a 2a 20 20 20 20 20 66 69 6c 65 5f 66  .  **     file_f
23d0: 6f 72 6d 61 74 3d 3d 33 20 20 20 20 56 65 72 73  ormat==3    Vers
23e0: 69 6f 6e 20 32 2e 36 2e 30 2e 20 46 69 78 20 65  ion 2.6.0. Fix e
23f0: 6d 70 74 79 2d 73 74 72 69 6e 67 20 69 6e 64 65  mpty-string inde
2400: 78 20 62 75 67 2e 0a 20 20 2a 2a 20 20 20 20 20  x bug..  **     
2410: 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 34 20 20  file_format==4  
2420: 20 20 56 65 72 73 69 6f 6e 20 32 2e 37 2e 30 2e    Version 2.7.0.
2430: 20 41 64 64 20 73 75 70 70 6f 72 74 20 66 6f 72   Add support for
2440: 20 73 65 70 61 72 61 74 65 20 6e 75 6d 65 72 69   separate numeri
2450: 63 20 61 6e 64 0a 20 20 2a 2a 20 20 20 20 20 20  c and.  **      
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 74 65 78 74 20 64 61 74 61 74 79 70 65 73 2e   text datatypes.
2480: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
2490: 66 69 6c 65 5f 66 6f 72 6d 61 74 3d 3d 30 20 29  file_format==0 )
24a0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
24b0: 70 70 65 6e 73 20 69 66 20 74 68 65 20 64 61 74  ppens if the dat
24c0: 61 62 61 73 65 20 77 61 73 20 69 6e 69 74 69 61  abase was initia
24d0: 6c 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20  lly empty */.   
24e0: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
24f0: 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 4;.  }else if
2500: 28 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  ( db->file_forma
2510: 74 3e 34 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>4 ){.    sqlit
2520: 65 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  eBtreeCloseCurso
2530: 72 28 63 75 72 4d 61 69 6e 29 3b 0a 20 20 20 20  r(curMain);.    
2540: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
2550: 70 7a 45 72 72 4d 73 67 2c 20 22 75 6e 73 75 70  pzErrMsg, "unsup
2560: 70 6f 72 74 65 64 20 66 69 6c 65 20 66 6f 72 6d  ported file form
2570: 61 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  at", 0);.    ret
2580: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2590: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
25a0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 6e 66 6f   the schema info
25b0: 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 74  rmation out of t
25c0: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  he schema tables
25d0: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
25e0: 73 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f  sParse, 0, sizeo
25f0: 66 28 73 50 61 72 73 65 29 29 3b 0a 20 20 73 50  f(sParse));.  sP
2600: 61 72 73 65 2e 64 62 20 3d 20 64 62 3b 0a 20 20  arse.db = db;.  
2610: 73 50 61 72 73 65 2e 70 42 65 20 3d 20 64 62 2d  sParse.pBe = db-
2620: 3e 70 42 65 3b 0a 20 20 73 50 61 72 73 65 2e 78  >pBe;.  sParse.x
2630: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
2640: 65 49 6e 69 74 43 61 6c 6c 62 61 63 6b 3b 0a 20  eInitCallback;. 
2650: 20 73 50 61 72 73 65 2e 70 41 72 67 20 3d 20 28   sParse.pArg = (
2660: 76 6f 69 64 2a 29 26 69 6e 69 74 44 61 74 61 3b  void*)&initData;
2670: 0a 20 20 73 50 61 72 73 65 2e 69 6e 69 74 46 6c  .  sParse.initFl
2680: 61 67 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65  ag = 1;.  sqlite
2690: 52 75 6e 50 61 72 73 65 72 28 26 73 50 61 72 73  RunParser(&sPars
26a0: 65 2c 0a 20 20 20 20 20 20 64 62 2d 3e 66 69 6c  e,.      db->fil
26b0: 65 5f 66 6f 72 6d 61 74 3e 3d 32 20 3f 20 69 6e  e_format>=2 ? in
26c0: 69 74 5f 73 63 72 69 70 74 20 3a 20 6f 6c 64 65  it_script : olde
26d0: 72 5f 69 6e 69 74 5f 73 63 72 69 70 74 2c 0a 20  r_init_script,. 
26e0: 20 20 20 20 20 70 7a 45 72 72 4d 73 67 29 3b 0a       pzErrMsg);.
26f0: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61 6c    if( sqlite_mal
2700: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
2710: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
2720: 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74  g(pzErrMsg, "out
2730: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b   of memory", 0);
2740: 0a 20 20 20 20 73 50 61 72 73 65 2e 72 63 20 3d  .    sParse.rc =
2750: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2760: 20 20 20 73 71 6c 69 74 65 42 74 72 65 65 52 6f     sqliteBtreeRo
2770: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 42 65 29 3b  llback(db->pBe);
2780: 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73 65 74  .    sqliteReset
2790: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
27a0: 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 50  b);.  }.  if( sP
27b0: 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49 54 45 5f  arse.rc==SQLITE_
27c0: 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 66 6c  OK ){.    db->fl
27d0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
27e0: 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 20 20 73  itialized;.    s
27f0: 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72  qliteCommitInter
2800: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
2810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
2820: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
2830: 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 3b 0a 20  E_Initialized;. 
2840: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e     sqliteResetIn
2850: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 29  ternalSchema(db)
2860: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 42 74  ;.  }.  sqliteBt
2870: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 63  reeCloseCursor(c
2880: 75 72 4d 61 69 6e 29 3b 0a 20 20 72 65 74 75 72  urMain);.  retur
2890: 6e 20 73 50 61 72 73 65 2e 72 63 3b 0a 7d 0a 0a  n sParse.rc;.}..
28a0: 2f 2a 0a 2a 2a 20 54 68 65 20 76 65 72 73 69 6f  /*.** The versio
28b0: 6e 20 6f 66 20 74 68 65 20 6c 69 62 72 61 72 79  n of the library
28c0: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 72  .*/.const char r
28d0: 63 73 69 64 5b 5d 20 3d 20 22 40 28 23 29 20 5c  csid[] = "@(#) \
28e0: 30 34 34 49 64 3a 20 53 51 4c 69 74 65 20 76 65  044Id: SQLite ve
28f0: 72 73 69 6f 6e 20 22 20 53 51 4c 49 54 45 5f 56  rsion " SQLITE_V
2900: 45 52 53 49 4f 4e 20 22 20 24 22 3b 0a 63 6f 6e  ERSION " $";.con
2910: 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 5f 76  st char sqlite_v
2920: 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54  ersion[] = SQLIT
2930: 45 5f 56 45 52 53 49 4f 4e 3b 0a 0a 2f 2a 0a 2a  E_VERSION;../*.*
2940: 2a 20 44 6f 65 73 20 74 68 65 20 6c 69 62 72 61  * Does the libra
2950: 72 79 20 65 78 70 65 63 74 20 64 61 74 61 20 74  ry expect data t
2960: 6f 20 62 65 20 65 6e 63 6f 64 65 64 20 61 73 20  o be encoded as 
2970: 55 54 46 2d 38 20 6f 72 20 69 73 6f 38 38 35 39  UTF-8 or iso8859
2980: 3f 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ?  The.** follow
2990: 69 6e 67 20 67 6c 6f 62 61 6c 20 63 6f 6e 73 74  ing global const
29a0: 61 6e 74 20 61 6c 77 61 79 73 20 6c 65 74 73 20  ant always lets 
29b0: 75 73 20 6b 6e 6f 77 2e 0a 2a 2f 0a 23 69 66 64  us know..*/.#ifd
29c0: 65 66 20 53 51 4c 49 54 45 5f 55 54 46 38 0a 63  ef SQLITE_UTF8.c
29d0: 6f 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65  onst char sqlite
29e0: 5f 65 6e 63 6f 64 69 6e 67 5b 5d 20 3d 20 22 55  _encoding[] = "U
29f0: 54 46 2d 38 22 3b 0a 23 65 6c 73 65 0a 63 6f 6e  TF-8";.#else.con
2a00: 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 5f 65  st char sqlite_e
2a10: 6e 63 6f 64 69 6e 67 5b 5d 20 3d 20 22 69 73 6f  ncoding[] = "iso
2a20: 38 38 35 39 22 3b 0a 23 65 6e 64 69 66 0a 0a 2f  8859";.#endif../
2a30: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
2a40: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
2a50: 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6e 20 22    Construct an "
2a60: 73 71 6c 69 74 65 22 20 73 74 72 75 63 74 75 72  sqlite" structur
2a70: 65 20 74 6f 20 64 65 66 69 6e 65 0a 2a 2a 20 74  e to define.** t
2a80: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 69 73  he state of this
2a90: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
2aa0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2ab0: 6f 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  o that structure
2ac0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 61 74 74 65 6d  ..**.** An attem
2ad0: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 69 6e  pt is made to in
2ae0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e 2d  itialize the in-
2af0: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
2b00: 63 74 75 72 65 73 20 74 68 61 74 0a 2a 2a 20 68  ctures that.** h
2b10: 6f 6c 64 20 74 68 65 20 64 61 74 61 62 61 73 65  old the database
2b20: 20 73 63 68 65 6d 61 2e 20 20 42 75 74 20 69 66   schema.  But if
2b30: 20 74 68 69 73 20 66 61 69 6c 73 20 28 62 65 63   this fails (bec
2b40: 61 75 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  ause the schema 
2b50: 66 69 6c 65 0a 2a 2a 20 69 73 20 6c 6f 63 6b 65  file.** is locke
2b60: 64 29 20 74 68 65 6e 20 74 68 61 74 20 73 74 65  d) then that ste
2b70: 70 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  p is deferred un
2b80: 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2b90: 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 5f  ll to.** sqlite_
2ba0: 65 78 65 63 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  exec()..*/.sqlit
2bb0: 65 20 2a 73 71 6c 69 74 65 5f 6f 70 65 6e 28 63  e *sqlite_open(c
2bc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2bd0: 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64 65 2c 20  name, int mode, 
2be0: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29  char **pzErrMsg)
2bf0: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
2c00: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
2c10: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
2c20: 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
2c30: 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
2c40: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
2c50: 66 28 73 71 6c 69 74 65 29 20 29 3b 0a 20 20 69  f(sqlite) );.  i
2c60: 66 28 20 70 7a 45 72 72 4d 73 67 20 29 20 2a 70  f( pzErrMsg ) *p
2c70: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69  zErrMsg = 0;.  i
2c80: 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20  f( db==0 ) goto 
2c90: 6e 6f 5f 6d 65 6d 5f 6f 6e 5f 6f 70 65 6e 3b 0a  no_mem_on_open;.
2ca0: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74    sqliteHashInit
2cb0: 28 26 64 62 2d 3e 74 62 6c 48 61 73 68 2c 20 53  (&db->tblHash, S
2cc0: 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e  QLITE_HASH_STRIN
2cd0: 47 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 48  G, 0);.  sqliteH
2ce0: 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 69 64 78  ashInit(&db->idx
2cf0: 48 61 73 68 2c 20 53 51 4c 49 54 45 5f 48 41 53  Hash, SQLITE_HAS
2d00: 48 5f 53 54 52 49 4e 47 2c 20 30 29 3b 0a 20 20  H_STRING, 0);.  
2d10: 73 71 6c 69 74 65 48 61 73 68 49 6e 69 74 28 26  sqliteHashInit(&
2d20: 64 62 2d 3e 74 72 69 67 48 61 73 68 2c 20 53 51  db->trigHash, SQ
2d30: 4c 49 54 45 5f 48 41 53 48 5f 53 54 52 49 4e 47  LITE_HASH_STRING
2d40: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 48 61  , 0);.  sqliteHa
2d50: 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 46 75 6e  shInit(&db->aFun
2d60: 63 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  c, SQLITE_HASH_S
2d70: 54 52 49 4e 47 2c 20 31 29 3b 0a 20 20 73 71 6c  TRING, 1);.  sql
2d80: 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d  iteHashInit(&db-
2d90: 3e 61 46 4b 65 79 2c 20 53 51 4c 49 54 45 5f 48  >aFKey, SQLITE_H
2da0: 41 53 48 5f 53 54 52 49 4e 47 2c 20 31 29 3b 0a  ASH_STRING, 1);.
2db0: 20 20 64 62 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20    db->onError = 
2dc0: 4f 45 5f 44 65 66 61 75 6c 74 3b 0a 20 20 64 62  OE_Default;.  db
2dd0: 2d 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 20  ->priorNewRowid 
2de0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  = 0;.  db->magic
2df0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
2e00: 42 55 53 59 3b 0a 20 20 0a 20 20 2f 2a 20 4f 70  BUSY;.  .  /* Op
2e10: 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64  en the backend d
2e20: 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a  atabase driver *
2e30: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42  /.  rc = sqliteB
2e40: 74 72 65 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61  treeOpen(zFilena
2e50: 6d 65 2c 20 30 2c 20 4d 41 58 5f 50 41 47 45 53  me, 0, MAX_PAGES
2e60: 2c 20 26 64 62 2d 3e 70 42 65 29 3b 0a 20 20 69  , &db->pBe);.  i
2e70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e80: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
2e90: 72 63 20 29 7b 0a 20 20 20 20 20 20 64 65 66 61  rc ){.      defa
2ea0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ult: {.        s
2eb0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70  qliteSetString(p
2ec0: 7a 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65  zErrMsg, "unable
2ed0: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
2ee0: 65 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e: ", zFilename,
2ef0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2f00: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
2f10: 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(db);.    sqlit
2f20: 65 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72  eStrRealloc(pzEr
2f30: 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
2f40: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  n 0;.  }..  /* A
2f50: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
2f60: 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 73  he schema */.  s
2f70: 71 6c 69 74 65 52 65 67 69 73 74 65 72 42 75 69  qliteRegisterBui
2f80: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
2f90: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2fa0: 49 6e 69 74 28 64 62 2c 20 70 7a 45 72 72 4d 73  Init(db, pzErrMs
2fb0: 67 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  g);.  db->magic 
2fc0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
2fd0: 50 45 4e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  PEN;.  if( sqlit
2fe0: 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  e_malloc_failed 
2ff0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 63 6c  ){.    sqlite_cl
3000: 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 67 6f 74  ose(db);.    got
3010: 6f 20 6e 6f 5f 6d 65 6d 5f 6f 6e 5f 6f 70 65 6e  o no_mem_on_open
3020: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
3030: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
3040: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
3050: 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 63 6c 6f  {.    sqlite_clo
3060: 73 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  se(db);.    sqli
3070: 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45  teStrRealloc(pzE
3080: 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75  rrMsg);.    retu
3090: 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rn 0;.  }else if
30a0: 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  ( pzErrMsg ){.  
30b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a    sqliteFree(*pz
30c0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70 7a  ErrMsg);.    *pz
30d0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
30e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
30f0: 61 62 61 73 65 20 69 73 20 69 6e 20 66 6f 72 6d  abase is in form
3100: 61 74 73 20 31 20 6f 72 20 32 2c 20 74 68 65 6e  ats 1 or 2, then
3110: 20 75 70 67 72 61 64 65 20 69 74 20 74 6f 0a 20   upgrade it to. 
3120: 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 20 20   ** version 3.  
3130: 54 68 69 73 20 77 69 6c 6c 20 72 65 63 6f 6e 73  This will recons
3140: 74 72 75 63 74 20 61 6c 6c 20 69 6e 64 69 63 65  truct all indice
3150: 73 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  s.  If the.  ** 
3160: 75 70 67 72 61 64 65 20 66 61 69 6c 73 20 66 6f  upgrade fails fo
3170: 72 20 61 6e 79 20 72 65 61 73 6f 6e 20 28 65 78  r any reason (ex
3180: 3a 20 6f 75 74 20 6f 66 20 64 69 73 6b 20 73 70  : out of disk sp
3190: 61 63 65 2c 20 64 61 74 61 62 61 73 65 0a 20 20  ace, database.  
31a0: 2a 2a 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 2c  ** is read only,
31b0: 20 69 6e 74 65 72 72 75 70 74 20 72 65 63 65 69   interrupt recei
31c0: 76 65 64 2c 20 65 74 63 2e 29 20 74 68 65 6e 20  ved, etc.) then 
31d0: 72 65 66 75 73 65 20 74 6f 20 6f 70 65 6e 2e 0a  refuse to open..
31e0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
31f0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e  QLITE_OK && db->
3200: 66 69 6c 65 5f 66 6f 72 6d 61 74 3c 33 20 29 7b  file_format<3 ){
3210: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20  .    char *zErr 
3220: 3d 20 30 3b 0a 20 20 20 20 49 6e 69 74 44 61 74  = 0;.    InitDat
3230: 61 20 69 6e 69 74 44 61 74 61 3b 0a 20 20 20 20  a initData;.    
3240: 69 6e 74 20 6d 65 74 61 5b 53 51 4c 49 54 45 5f  int meta[SQLITE_
3250: 4e 5f 42 54 52 45 45 5f 4d 45 54 41 5d 3b 0a 0a  N_BTREE_META];..
3260: 20 20 20 20 69 6e 69 74 44 61 74 61 2e 64 62 20      initData.db 
3270: 3d 20 64 62 3b 0a 20 20 20 20 69 6e 69 74 44 61  = db;.    initDa
3280: 74 61 2e 70 7a 45 72 72 4d 73 67 20 3d 20 26 7a  ta.pzErrMsg = &z
3290: 45 72 72 3b 0a 20 20 20 20 64 62 2d 3e 66 69 6c  Err;.    db->fil
32a0: 65 5f 66 6f 72 6d 61 74 20 3d 20 33 3b 0a 20 20  e_format = 3;.  
32b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 65 78    rc = sqlite_ex
32c0: 65 63 28 64 62 2c 0a 20 20 20 20 20 20 22 42 45  ec(db,.      "BE
32d0: 47 49 4e 3b 20 53 45 4c 45 43 54 20 6e 61 6d 65  GIN; SELECT name
32e0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
32f0: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27  ter WHERE type='
3300: 74 61 62 6c 65 27 3b 22 2c 0a 20 20 20 20 20 20  table';",.      
3310: 75 70 67 72 61 64 65 5f 33 5f 63 61 6c 6c 62 61  upgrade_3_callba
3320: 63 6b 2c 0a 20 20 20 20 20 20 26 69 6e 69 74 44  ck,.      &initD
3330: 61 74 61 2c 0a 20 20 20 20 20 20 26 7a 45 72 72  ata,.      &zErr
3340: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
3350: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3360: 20 20 73 71 6c 69 74 65 42 74 72 65 65 47 65 74    sqliteBtreeGet
3370: 4d 65 74 61 28 64 62 2d 3e 70 42 65 2c 20 6d 65  Meta(db->pBe, me
3380: 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 74 61 5b  ta);.      meta[
3390: 32 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 73 71  2] = 4;.      sq
33a0: 6c 69 74 65 42 74 72 65 65 55 70 64 61 74 65 4d  liteBtreeUpdateM
33b0: 65 74 61 28 64 62 2d 3e 70 42 65 2c 20 6d 65 74  eta(db->pBe, met
33c0: 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
33d0: 5f 65 78 65 63 28 64 62 2c 20 22 43 4f 4d 4d 49  _exec(db, "COMMI
33e0: 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
33f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
3400: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3410: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
3420: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20  ng(pzErrMsg, .  
3430: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
3440: 20 75 70 67 72 61 64 65 20 64 61 74 61 62 61 73   upgrade databas
3450: 65 20 74 6f 20 74 68 65 20 76 65 72 73 69 6f 6e  e to the version
3460: 20 32 2e 36 20 66 6f 72 6d 61 74 22 2c 0a 20 20   2.6 format",.  
3470: 20 20 20 20 20 20 7a 45 72 72 20 3f 20 22 3a 20        zErr ? ": 
3480: 22 20 3a 20 30 2c 20 7a 45 72 72 2c 20 30 29 3b  " : 0, zErr, 0);
3490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 5f 66 72  .      sqlite_fr
34a0: 65 65 6d 65 6d 28 7a 45 72 72 29 3b 0a 20 20 20  eemem(zErr);.   
34b0: 20 20 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c     sqliteStrReal
34c0: 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a 20  loc(pzErrMsg);. 
34d0: 20 20 20 20 20 73 71 6c 69 74 65 5f 63 6c 6f 73       sqlite_clos
34e0: 65 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  e(db);.      ret
34f0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3500: 20 73 71 6c 69 74 65 5f 66 72 65 65 6d 65 6d 28   sqlite_freemem(
3510: 7a 45 72 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zErr);.  }..  /*
3520: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
3530: 72 20 74 6f 20 74 68 65 20 6e 65 77 6c 79 20 6f  r to the newly o
3540: 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 20 73  pened database s
3550: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 72 65  tructure */.  re
3560: 74 75 72 6e 20 64 62 3b 0a 0a 6e 6f 5f 6d 65 6d  turn db;..no_mem
3570: 5f 6f 6e 5f 6f 70 65 6e 3a 0a 20 20 73 71 6c 69  _on_open:.  sqli
3580: 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  teSetString(pzEr
3590: 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66 20 6d 65  rMsg, "out of me
35a0: 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20 73 71 6c  mory", 0);.  sql
35b0: 69 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a  iteStrRealloc(pz
35c0: 45 72 72 4d 73 67 29 3b 0a 20 20 72 65 74 75 72  ErrMsg);.  retur
35d0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
35e0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
35f0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
3600: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 69 6e 74 20  t insert.*/.int 
3610: 73 71 6c 69 74 65 5f 6c 61 73 74 5f 69 6e 73 65  sqlite_last_inse
3620: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 20  rt_rowid(sqlite 
3630: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
3640: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a  b->lastRowid;.}.
3650: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3660: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
3670: 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20  ges in the most 
3680: 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73  recent call to s
3690: 71 6c 69 74 65 5f 65 78 65 63 28 29 2e 0a 2a 2f  qlite_exec()..*/
36a0: 0a 69 6e 74 20 73 71 6c 69 74 65 5f 63 68 61 6e  .int sqlite_chan
36b0: 67 65 73 28 73 71 6c 69 74 65 20 2a 64 62 29 7b  ges(sqlite *db){
36c0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
36d0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
36e0: 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Close an existin
36f0: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
3700: 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  e.*/.void sqlite
3710: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 20 2a 64  _close(sqlite *d
3720: 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  b){.  HashElem *
3730: 69 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53  i;.  if( sqliteS
3740: 61 66 65 74 79 43 68 65 63 6b 28 64 62 29 20 7c  afetyCheck(db) |
3750: 7c 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 6e  | sqliteSafetyOn
3760: 28 64 62 29 20 29 7b 20 72 65 74 75 72 6e 3b 20  (db) ){ return; 
3770: 7d 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  }.  db->magic = 
3780: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
3790: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 42 74 72  SED;.  sqliteBtr
37a0: 65 65 43 6c 6f 73 65 28 64 62 2d 3e 70 42 65 29  eeClose(db->pBe)
37b0: 3b 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 49  ;.  sqliteResetI
37c0: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
37d0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 42 65  );.  if( db->pBe
37e0: 54 65 6d 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  Temp ){.    sqli
37f0: 74 65 42 74 72 65 65 43 6c 6f 73 65 28 64 62 2d  teBtreeClose(db-
3800: 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20 7d 0a 20  >pBeTemp);.  }. 
3810: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
3820: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e  hFirst(&db->aFun
3830: 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  c); i; i=sqliteH
3840: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
3850: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 2c   FuncDef *pFunc,
3860: 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 66 6f 72   *pNext;.    for
3870: 28 70 46 75 6e 63 20 3d 20 28 46 75 6e 63 44 65  (pFunc = (FuncDe
3880: 66 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  f*)sqliteHashDat
3890: 61 28 69 29 3b 20 70 46 75 6e 63 3b 20 70 46 75  a(i); pFunc; pFu
38a0: 6e 63 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  nc=pNext){.     
38b0: 20 70 4e 65 78 74 20 3d 20 70 46 75 6e 63 2d 3e   pNext = pFunc->
38c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
38d0: 69 74 65 46 72 65 65 28 70 46 75 6e 63 29 3b 0a  iteFree(pFunc);.
38e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
38f0: 74 65 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  teHashClear(&db-
3900: 3e 61 46 75 6e 63 29 3b 0a 20 20 73 71 6c 69 74  >aFunc);.  sqlit
3910: 65 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  eHashClear(&db->
3920: 61 46 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  aFKey);.  sqlite
3930: 46 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a  Free(db);.}../*.
3940: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
3950: 66 20 74 68 65 20 67 69 76 65 6e 20 53 51 4c 20  f the given SQL 
3960: 73 74 72 69 6e 67 20 65 6e 64 73 20 69 6e 20 61  string ends in a
3970: 20 73 65 6d 69 63 6f 6c 6f 6e 2e 0a 2a 2a 0a 2a   semicolon..**.*
3980: 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  * Special handli
3990: 6e 67 20 69 73 20 72 65 71 75 69 72 65 20 66 6f  ng is require fo
39a0: 72 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  r CREATE TRIGGER
39b0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20   statements..** 
39c0: 57 68 65 6e 65 76 65 72 20 74 68 65 20 43 52 45  Whenever the CRE
39d0: 41 54 45 20 54 52 49 47 47 45 52 20 6b 65 79 77  ATE TRIGGER keyw
39e0: 6f 72 64 73 20 61 72 65 20 73 65 65 6e 2c 20 74  ords are seen, t
39f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
3a00: 6d 75 73 74 20 65 6e 64 20 77 69 74 68 20 22 3b  must end with ";
3a10: 45 4e 44 3b 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  END;"..*/.int sq
3a20: 6c 69 74 65 5f 63 6f 6d 70 6c 65 74 65 28 63 6f  lite_complete(co
3a30: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b  nst char *zSql){
3a40: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74  .  int isComplet
3a50: 65 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 65 71  e = 1;.  int req
3a60: 75 69 72 65 45 6e 64 20 3d 20 30 3b 0a 20 20 69  uireEnd = 0;.  i
3a70: 6e 74 20 73 65 65 6e 54 65 78 74 20 3d 20 30 3b  nt seenText = 0;
3a80: 0a 20 20 69 6e 74 20 73 65 65 6e 43 72 65 61 74  .  int seenCreat
3a90: 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  e = 0;.  while( 
3aa0: 2a 7a 53 71 6c 20 29 7b 0a 20 20 20 20 73 77 69  *zSql ){.    swi
3ab0: 74 63 68 28 20 2a 7a 53 71 6c 20 29 7b 0a 20 20  tch( *zSql ){.  
3ac0: 20 20 20 20 63 61 73 65 20 27 3b 27 3a 20 7b 0a      case ';': {.
3ad0: 20 20 20 20 20 20 20 20 69 73 43 6f 6d 70 6c 65          isComple
3ae0: 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  te = 1;.        
3af0: 73 65 65 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20  seenText = 1;.  
3b00: 20 20 20 20 20 20 73 65 65 6e 43 72 65 61 74 65        seenCreate
3b10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
3b20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3b30: 20 20 20 63 61 73 65 20 27 20 27 3a 0a 20 20 20     case ' ':.   
3b40: 20 20 20 63 61 73 65 20 27 5c 74 27 3a 0a 20 20     case '\t':.  
3b50: 20 20 20 20 63 61 73 65 20 27 5c 6e 27 3a 0a 20      case '\n':. 
3b60: 20 20 20 20 20 63 61 73 65 20 27 5c 66 27 3a 20       case '\f': 
3b70: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
3b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3b90: 61 73 65 20 27 5b 27 3a 20 7b 0a 20 20 20 20 20  ase '[': {.     
3ba0: 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20     isComplete = 
3bb0: 30 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 54  0;.        seenT
3bc0: 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ext = 1;.       
3bd0: 20 73 65 65 6e 43 72 65 61 74 65 20 3d 20 30 3b   seenCreate = 0;
3be0: 0a 20 20 20 20 20 20 20 20 7a 53 71 6c 2b 2b 3b  .        zSql++;
3bf0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
3c00: 2a 7a 53 71 6c 20 26 26 20 2a 7a 53 71 6c 21 3d  *zSql && *zSql!=
3c10: 27 5d 27 20 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d  ']' ){ zSql++; }
3c20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53  .        if( *zS
3c30: 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ql==0 ) return 0
3c40: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3c60: 61 73 65 20 27 22 27 3a 0a 20 20 20 20 20 20 63  ase '"':.      c
3c70: 61 73 65 20 27 5c 27 27 3a 20 7b 0a 20 20 20 20  ase '\'': {.    
3c80: 20 20 20 20 69 6e 74 20 63 20 3d 20 2a 7a 53 71      int c = *zSq
3c90: 6c 3b 0a 20 20 20 20 20 20 20 20 69 73 43 6f 6d  l;.        isCom
3ca0: 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  plete = 0;.     
3cb0: 20 20 20 73 65 65 6e 54 65 78 74 20 3d 20 31 3b     seenText = 1;
3cc0: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 43 72 65  .        seenCre
3cd0: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ate = 0;.       
3ce0: 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   zSql++;.       
3cf0: 20 77 68 69 6c 65 28 20 2a 7a 53 71 6c 20 26 26   while( *zSql &&
3d00: 20 2a 7a 53 71 6c 21 3d 63 20 29 7b 20 7a 53 71   *zSql!=c ){ zSq
3d10: 6c 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  l++; }.        i
3d20: 66 28 20 2a 7a 53 71 6c 3d 3d 30 20 29 20 72 65  f( *zSql==0 ) re
3d30: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
3d40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3d50: 20 20 20 20 20 63 61 73 65 20 27 2d 27 3a 20 7b       case '-': {
3d60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 71  .        if( zSq
3d70: 6c 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  l[1]!='-' ){.   
3d80: 20 20 20 20 20 20 20 69 73 43 6f 6d 70 6c 65 74         isComplet
3d90: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
3da0: 20 73 65 65 6e 43 72 65 61 74 65 20 3d 20 30 3b   seenCreate = 0;
3db0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
3dc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3dd0: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 53 71 6c      while( *zSql
3de0: 20 26 26 20 2a 7a 53 71 6c 21 3d 27 5c 6e 27 20   && *zSql!='\n' 
3df0: 29 7b 20 7a 53 71 6c 2b 2b 3b 20 7d 0a 20 20 20  ){ zSql++; }.   
3e00: 20 20 20 20 20 69 66 28 20 2a 7a 53 71 6c 3d 3d       if( *zSql==
3e10: 30 20 29 20 72 65 74 75 72 6e 20 73 65 65 6e 54  0 ) return seenT
3e20: 65 78 74 20 26 26 20 69 73 43 6f 6d 70 6c 65 74  ext && isComplet
3e30: 65 20 26 26 20 72 65 71 75 69 72 65 45 6e 64 3d  e && requireEnd=
3e40: 3d 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  =0;.        brea
3e50: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3e60: 20 63 61 73 65 20 27 63 27 3a 0a 20 20 20 20 20   case 'c':.     
3e70: 20 63 61 73 65 20 27 43 27 3a 20 7b 0a 20 20 20   case 'C': {.   
3e80: 20 20 20 20 20 73 65 65 6e 54 65 78 74 20 3d 20       seenText = 
3e90: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  1;.        if( !
3ea0: 69 73 43 6f 6d 70 6c 65 74 65 20 29 20 62 72 65  isComplete ) bre
3eb0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 73 43 6f  ak;.        isCo
3ec0: 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20 20 20 20  mplete = 0;.    
3ed0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
3ee0: 72 4e 49 43 6d 70 28 7a 53 71 6c 2c 20 22 63 72  rNICmp(zSql, "cr
3ef0: 65 61 74 65 22 2c 20 36 29 21 3d 30 20 29 20 62  eate", 6)!=0 ) b
3f00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
3f10: 28 20 21 69 73 73 70 61 63 65 28 7a 53 71 6c 5b  ( !isspace(zSql[
3f20: 36 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  6]) ) break;.   
3f30: 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20 35 3b 0a       zSql += 5;.
3f40: 20 20 20 20 20 20 20 20 73 65 65 6e 43 72 65 61          seenCrea
3f50: 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  te = 1;.        
3f60: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a  while( isspace(z
3f70: 53 71 6c 5b 31 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[1]) ) zSql++
3f80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
3f90: 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 26 7a 53  liteStrNICmp(&zS
3fa0: 71 6c 5b 31 5d 2c 22 74 72 69 67 67 65 72 22 2c  ql[1],"trigger",
3fb0: 20 37 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a   7)!=0 ) break;.
3fc0: 20 20 20 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20          zSql += 
3fd0: 37 3b 0a 20 20 20 20 20 20 20 20 72 65 71 75 69  7;.        requi
3fe0: 72 65 45 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20  reEnd++;.       
3ff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4000: 20 20 20 20 20 20 63 61 73 65 20 27 74 27 3a 0a        case 't':.
4010: 20 20 20 20 20 20 63 61 73 65 20 27 54 27 3a 20        case 'T': 
4020: 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 54 65  {.        seenTe
4030: 78 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  xt = 1;.        
4040: 69 66 28 20 21 73 65 65 6e 43 72 65 61 74 65 20  if( !seenCreate 
4050: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
4060: 20 73 65 65 6e 43 72 65 61 74 65 20 3d 20 30 3b   seenCreate = 0;
4070: 0a 20 20 20 20 20 20 20 20 69 73 43 6f 6d 70 6c  .        isCompl
4080: 65 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ete = 0;.       
4090: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49   if( sqliteStrNI
40a0: 43 6d 70 28 7a 53 71 6c 2c 20 22 74 72 69 67 67  Cmp(zSql, "trigg
40b0: 65 72 22 2c 20 37 29 21 3d 30 20 29 20 62 72 65  er", 7)!=0 ) bre
40c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
40d0: 21 69 73 73 70 61 63 65 28 7a 53 71 6c 5b 37 5d  !isspace(zSql[7]
40e0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
40f0: 20 20 20 7a 53 71 6c 20 2b 3d 20 36 3b 0a 20 20     zSql += 6;.  
4100: 20 20 20 20 20 20 72 65 71 75 69 72 65 45 6e 64        requireEnd
4110: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
4120: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4130: 20 63 61 73 65 20 27 65 27 3a 0a 20 20 20 20 20   case 'e':.     
4140: 20 63 61 73 65 20 27 45 27 3a 20 7b 0a 20 20 20   case 'E': {.   
4150: 20 20 20 20 20 73 65 65 6e 43 72 65 61 74 65 20       seenCreate 
4160: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 65 65  = 0;.        see
4170: 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20  nText = 1;.     
4180: 20 20 20 69 66 28 20 21 69 73 43 6f 6d 70 6c 65     if( !isComple
4190: 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  te ) break;.    
41a0: 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d      isComplete =
41b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
41c0: 72 65 71 75 69 72 65 45 6e 64 3d 3d 30 20 29 20  requireEnd==0 ) 
41d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
41e0: 66 28 20 73 71 6c 69 74 65 53 74 72 4e 49 43 6d  f( sqliteStrNICm
41f0: 70 28 7a 53 71 6c 2c 20 22 65 6e 64 22 2c 20 33  p(zSql, "end", 3
4200: 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
4210: 20 20 20 20 20 20 7a 53 71 6c 20 2b 3d 20 32 3b        zSql += 2;
4220: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
4230: 69 73 73 70 61 63 65 28 7a 53 71 6c 5b 31 5d 29  isspace(zSql[1])
4240: 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
4250: 20 20 20 69 66 28 20 7a 53 71 6c 5b 31 5d 3d 3d     if( zSql[1]==
4260: 27 3b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ';' ){.         
4270: 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20   zSql++;.       
4280: 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20     isComplete = 
4290: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 71  1;.          req
42a0: 75 69 72 65 45 6e 64 2d 2d 3b 0a 20 20 20 20 20  uireEnd--;.     
42b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
42c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
42d0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
42e0: 20 20 20 20 20 73 65 65 6e 43 72 65 61 74 65 20       seenCreate 
42f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 65 65  = 0;.        see
4300: 6e 54 65 78 74 20 3d 20 31 3b 0a 20 20 20 20 20  nText = 1;.     
4310: 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20     isComplete = 
4320: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
4330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4340: 20 20 20 20 7a 53 71 6c 2b 2b 3b 0a 20 20 7d 0a      zSql++;.  }.
4350: 20 20 72 65 74 75 72 6e 20 73 65 65 6e 54 65 78    return seenTex
4360: 74 20 26 26 20 69 73 43 6f 6d 70 6c 65 74 65 20  t && isComplete 
4370: 26 26 20 72 65 71 75 69 72 65 45 6e 64 3d 3d 30  && requireEnd==0
4380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
4390: 74 65 20 53 51 4c 20 63 6f 64 65 2e 20 20 52 65  te SQL code.  Re
43a0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
43b0: 53 51 4c 49 54 45 5f 20 73 75 63 63 65 73 73 2f  SQLITE_ success/
43c0: 66 61 69 6c 75 72 65 0a 2a 2a 20 63 6f 64 65 73  failure.** codes
43d0: 2e 20 20 41 6c 73 6f 20 77 72 69 74 65 20 61 6e  .  Also write an
43e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
43f0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
4400: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c  ned from.** mall
4410: 6f 63 28 29 20 61 6e 64 20 6d 61 6b 65 20 2a 70  oc() and make *p
4420: 7a 45 72 72 4d 73 67 20 70 6f 69 6e 74 20 74 6f  zErrMsg point to
4430: 20 74 68 61 74 20 6d 65 73 73 61 67 65 2e 0a 2a   that message..*
4440: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 20  *.** If the SQL 
4450: 69 73 20 61 20 71 75 65 72 79 2c 20 74 68 65 6e  is a query, then
4460: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e   for each row in
4470: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
4480: 74 0a 2a 2a 20 74 68 65 20 78 43 61 6c 6c 62 61  t.** the xCallba
4490: 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  ck() function is
44a0: 20 63 61 6c 6c 65 64 2e 20 20 70 41 72 67 20 62   called.  pArg b
44b0: 65 63 6f 6d 65 73 20 74 68 65 20 66 69 72 73 74  ecomes the first
44c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
44d0: 78 43 61 6c 6c 62 61 63 6b 28 29 2e 20 20 49 66  xCallback().  If
44e0: 20 78 43 61 6c 6c 62 61 63 6b 3d 4e 55 4c 4c 20   xCallback=NULL 
44f0: 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b  then no callback
4500: 0a 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  .** is invoked, 
4510: 65 76 65 6e 20 66 6f 72 20 71 75 65 72 69 65 73  even for queries
4520: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f  ..*/.int sqlite_
4530: 65 78 65 63 28 0a 20 20 73 71 6c 69 74 65 20 2a  exec(.  sqlite *
4540: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
4550: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
4560: 61 73 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65  ase on which the
4570: 20 53 51 4c 20 65 78 65 63 75 74 65 73 20 2a 2f   SQL executes */
4580: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4590: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Sql,           /
45a0: 2a 20 54 68 65 20 53 51 4c 20 74 6f 20 62 65 20  * The SQL to be 
45b0: 65 78 65 63 75 74 65 64 20 2a 2f 0a 20 20 73 71  executed */.  sq
45c0: 6c 69 74 65 5f 63 61 6c 6c 62 61 63 6b 20 78 43  lite_callback xC
45d0: 61 6c 6c 62 61 63 6b 2c 20 20 2f 2a 20 49 6e 76  allback,  /* Inv
45e0: 6f 6b 65 20 74 68 69 73 20 63 61 6c 6c 62 61 63  oke this callbac
45f0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 76  k routine */.  v
4600: 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20  oid *pArg,      
4610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4620: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
4630: 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 20  xCallback() */. 
4640: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4660: 57 72 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73  Write error mess
4670: 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ages here */.){.
4680: 20 20 50 61 72 73 65 20 73 50 61 72 73 65 3b 0a    Parse sParse;.
4690: 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  .  if( pzErrMsg 
46a0: 29 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ) *pzErrMsg = 0;
46b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 61 66  .  if( sqliteSaf
46c0: 65 74 79 4f 6e 28 64 62 29 20 29 20 67 6f 74 6f  etyOn(db) ) goto
46d0: 20 65 78 65 63 5f 6d 69 73 75 73 65 3b 0a 23 69   exec_misuse;.#i
46e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
46f0: 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20 64 62  T_TRACE.  if( db
4700: 2d 3e 78 54 72 61 63 65 20 29 20 64 62 2d 3e 78  ->xTrace ) db->x
4710: 54 72 61 63 65 28 64 62 2d 3e 70 54 72 61 63 65  Trace(db->pTrace
4720: 41 72 67 2c 20 7a 53 71 6c 29 3b 0a 23 65 6e 64  Arg, zSql);.#end
4730: 69 66 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  if.  if( (db->fl
4740: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 69  ags & SQLITE_Ini
4750: 74 69 61 6c 69 7a 65 64 29 3d 3d 30 20 29 7b 0a  tialized)==0 ){.
4760: 20 20 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20      int rc, cnt 
4770: 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
4780: 28 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69 74  (rc = sqliteInit
4790: 28 64 62 2c 20 70 7a 45 72 72 4d 73 67 29 29 3d  (db, pzErrMsg))=
47a0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20  =SQLITE_BUSY.   
47b0: 20 20 20 20 26 26 20 64 62 2d 3e 78 42 75 73 79      && db->xBusy
47c0: 43 61 6c 6c 62 61 63 6b 20 26 26 20 64 62 2d 3e  Callback && db->
47d0: 78 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 64 62  xBusyCallback(db
47e0: 2d 3e 70 42 75 73 79 41 72 67 2c 20 22 22 2c 20  ->pBusyArg, "", 
47f0: 63 6e 74 2b 2b 29 21 3d 30 20 29 7b 7d 0a 20 20  cnt++)!=0 ){}.  
4800: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4810: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
4820: 69 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a  iteStrRealloc(pz
4830: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73  ErrMsg);.      s
4840: 71 6c 69 74 65 53 61 66 65 74 79 4f 66 66 28 64  qliteSafetyOff(d
4850: 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  b);.      return
4860: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
4870: 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20  f( pzErrMsg ){. 
4880: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
4890: 2a 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  *pzErrMsg);.    
48a0: 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b    *pzErrMsg = 0;
48b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
48c0: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
48d0: 3c 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <3 ){.    sqlite
48e0: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20  SafetyOff(db);. 
48f0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
4900: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 6f 62  ng(pzErrMsg, "ob
4910: 73 6f 6c 65 74 65 20 64 61 74 61 62 61 73 65 20  solete database 
4920: 66 69 6c 65 20 66 6f 72 6d 61 74 22 2c 20 30 29  file format", 0)
4930: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
4940: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
4950: 20 69 66 28 20 64 62 2d 3e 72 65 63 75 72 73 69   if( db->recursi
4960: 6f 6e 44 65 70 74 68 3d 3d 30 20 29 7b 20 64 62  onDepth==0 ){ db
4970: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 20 7d  ->nChange = 0; }
4980: 0a 20 20 64 62 2d 3e 72 65 63 75 72 73 69 6f 6e  .  db->recursion
4990: 44 65 70 74 68 2b 2b 3b 0a 20 20 6d 65 6d 73 65  Depth++;.  memse
49a0: 74 28 26 73 50 61 72 73 65 2c 20 30 2c 20 73 69  t(&sParse, 0, si
49b0: 7a 65 6f 66 28 73 50 61 72 73 65 29 29 3b 0a 20  zeof(sParse));. 
49c0: 20 73 50 61 72 73 65 2e 64 62 20 3d 20 64 62 3b   sParse.db = db;
49d0: 0a 20 20 73 50 61 72 73 65 2e 70 42 65 20 3d 20  .  sParse.pBe = 
49e0: 64 62 2d 3e 70 42 65 3b 0a 20 20 73 50 61 72 73  db->pBe;.  sPars
49f0: 65 2e 78 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  e.xCallback = xC
4a00: 61 6c 6c 62 61 63 6b 3b 0a 20 20 73 50 61 72 73  allback;.  sPars
4a10: 65 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  e.pArg = pArg;. 
4a20: 20 73 71 6c 69 74 65 52 75 6e 50 61 72 73 65 72   sqliteRunParser
4a30: 28 26 73 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  (&sParse, zSql, 
4a40: 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  pzErrMsg);.  if(
4a50: 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66   sqlite_malloc_f
4a60: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
4a70: 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45  iteSetString(pzE
4a80: 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66 20 6d  rrMsg, "out of m
4a90: 65 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20 20 20  emory", 0);.    
4aa0: 73 50 61 72 73 65 2e 72 63 20 3d 20 53 51 4c 49  sParse.rc = SQLI
4ab0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71  TE_NOMEM;.    sq
4ac0: 6c 69 74 65 42 74 72 65 65 52 6f 6c 6c 62 61 63  liteBtreeRollbac
4ad0: 6b 28 64 62 2d 3e 70 42 65 29 3b 0a 20 20 20 20  k(db->pBe);.    
4ae0: 69 66 28 20 64 62 2d 3e 70 42 65 54 65 6d 70 20  if( db->pBeTemp 
4af0: 29 20 73 71 6c 69 74 65 42 74 72 65 65 52 6f 6c  ) sqliteBtreeRol
4b00: 6c 62 61 63 6b 28 64 62 2d 3e 70 42 65 54 65 6d  lback(db->pBeTem
4b10: 70 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  p);.    db->flag
4b20: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 54  s &= ~SQLITE_InT
4b30: 72 61 6e 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  rans;.    sqlite
4b40: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
4b50: 65 6d 61 28 64 62 29 3b 0a 20 20 7d 0a 20 20 69  ema(db);.  }.  i
4b60: 66 28 20 73 50 61 72 73 65 2e 72 63 21 3d 53 51  f( sParse.rc!=SQ
4b70: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 7a 45 72 72  LITE_OK && pzErr
4b80: 4d 73 67 20 26 26 20 2a 70 7a 45 72 72 4d 73 67  Msg && *pzErrMsg
4b90: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4ba0: 65 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  eSetString(pzErr
4bb0: 4d 73 67 2c 20 73 71 6c 69 74 65 5f 65 72 72 6f  Msg, sqlite_erro
4bc0: 72 5f 73 74 72 69 6e 67 28 73 50 61 72 73 65 2e  r_string(sParse.
4bd0: 72 63 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  rc), 0);.  }.  s
4be0: 71 6c 69 74 65 53 74 72 52 65 61 6c 6c 6f 63 28  qliteStrRealloc(
4bf0: 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  pzErrMsg);.  if(
4c00: 20 73 50 61 72 73 65 2e 72 63 3d 3d 53 51 4c 49   sParse.rc==SQLI
4c10: 54 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20  TE_SCHEMA ){.   
4c20: 20 73 71 6c 69 74 65 52 65 73 65 74 49 6e 74 65   sqliteResetInte
4c30: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 29 3b 0a  rnalSchema(db);.
4c40: 20 20 7d 0a 20 20 64 62 2d 3e 72 65 63 75 72 73    }.  db->recurs
4c50: 69 6f 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 69 66  ionDepth--;.  if
4c60: 28 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 66  ( sqliteSafetyOf
4c70: 66 28 64 62 29 20 29 20 67 6f 74 6f 20 65 78 65  f(db) ) goto exe
4c80: 63 5f 6d 69 73 75 73 65 3b 0a 20 20 72 65 74 75  c_misuse;.  retu
4c90: 72 6e 20 73 50 61 72 73 65 2e 72 63 3b 0a 0a 65  rn sParse.rc;..e
4ca0: 78 65 63 5f 6d 69 73 75 73 65 3a 0a 20 20 69 66  xec_misuse:.  if
4cb0: 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  ( pzErrMsg ){.  
4cc0: 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b    *pzErrMsg = 0;
4cd0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
4ce0: 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 73  ring(pzErrMsg, s
4cf0: 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74 72 69  qlite_error_stri
4d00: 6e 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ng(SQLITE_MISUSE
4d10: 29 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ), 0);.    sqlit
4d20: 65 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72  eStrRealloc(pzEr
4d30: 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rMsg);.  }.  ret
4d40: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
4d50: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
4d60: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
4d70: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
4d80: 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
4d90: 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
4da0: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
4db0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
4dc0: 2a 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73 74  *sqlite_error_st
4dd0: 72 69 6e 67 28 69 6e 74 20 72 63 29 7b 0a 20 20  ring(int rc){.  
4de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
4df0: 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
4e00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
4e10: 4b 3a 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22  K:         z = "
4e20: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 3b 20 20  not an error";  
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4e50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
4e60: 52 52 4f 52 3a 20 20 20 20 20 20 7a 20 3d 20 22  RROR:      z = "
4e70: 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20  SQL logic error 
4e80: 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62  or missing datab
4e90: 61 73 65 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ase";   break;. 
4ea0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
4eb0: 4e 54 45 52 4e 41 4c 3a 20 20 20 7a 20 3d 20 22  NTERNAL:   z = "
4ec0: 69 6e 74 65 72 6e 61 6c 20 53 51 4c 69 74 65 20  internal SQLite 
4ed0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 66  implementation f
4ee0: 6c 61 77 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  law";   break;. 
4ef0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
4f00: 45 52 4d 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ERM:       z = "
4f10: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
4f20: 6e 20 64 65 6e 69 65 64 22 3b 20 20 20 20 20 20  n denied";      
4f30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4f40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
4f50: 42 4f 52 54 3a 20 20 20 20 20 20 7a 20 3d 20 22  BORT:      z = "
4f60: 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74  callback request
4f70: 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 3b  ed query abort";
4f80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4f90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
4fa0: 55 53 59 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  USY:       z = "
4fb0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
4fc0: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
4fd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4fe0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
4ff0: 4f 43 4b 45 44 3a 20 20 20 20 20 7a 20 3d 20 22  OCKED:     z = "
5000: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
5010: 73 20 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20 20  s locked";      
5020: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5030: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
5040: 4f 4d 45 4d 3a 20 20 20 20 20 20 7a 20 3d 20 22  OMEM:      z = "
5050: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 3b 20  out of memory"; 
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5080: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
5090: 45 41 44 4f 4e 4c 59 3a 20 20 20 7a 20 3d 20 22  EADONLY:   z = "
50a0: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
50b0: 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
50c0: 62 61 73 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20  base";  break;. 
50d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
50e0: 4e 54 45 52 52 55 50 54 3a 20 20 7a 20 3d 20 22  NTERRUPT:  z = "
50f0: 69 6e 74 65 72 72 75 70 74 65 64 22 3b 20 20 20  interrupted";   
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5120: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
5130: 4f 45 52 52 3a 20 20 20 20 20 20 7a 20 3d 20 22  OERR:      z = "
5140: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 3b  disk I/O error";
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5170: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5180: 4f 52 52 55 50 54 3a 20 20 20 20 7a 20 3d 20 22  ORRUPT:    z = "
5190: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
51a0: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
51b0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
51c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
51d0: 4f 54 46 4f 55 4e 44 3a 20 20 20 7a 20 3d 20 22  OTFOUND:   z = "
51e0: 74 61 62 6c 65 20 6f 72 20 72 65 63 6f 72 64 20  table or record 
51f0: 6e 6f 74 20 66 6f 75 6e 64 22 3b 20 20 20 20 20  not found";     
5200: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5210: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
5220: 55 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ULL:       z = "
5230: 64 61 74 61 62 61 73 65 20 69 73 20 66 75 6c 6c  database is full
5240: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
5250: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5260: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5270: 41 4e 54 4f 50 45 4e 3a 20 20 20 7a 20 3d 20 22  ANTOPEN:   z = "
5280: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
5290: 61 74 61 62 61 73 65 20 66 69 6c 65 22 3b 20 20  atabase file";  
52a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
52b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
52c0: 52 4f 54 4f 43 4f 4c 3a 20 20 20 7a 20 3d 20 22  ROTOCOL:   z = "
52d0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 69 6e 67  database locking
52e0: 20 70 72 6f 74 6f 63 6f 6c 20 66 61 69 6c 75 72   protocol failur
52f0: 65 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  e";     break;. 
5300: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45     case SQLITE_E
5310: 4d 50 54 59 3a 20 20 20 20 20 20 7a 20 3d 20 22  MPTY:      z = "
5320: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e  table contains n
5330: 6f 20 64 61 74 61 22 3b 20 20 20 20 20 20 20 20  o data";        
5340: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5350: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
5360: 43 48 45 4d 41 3a 20 20 20 20 20 7a 20 3d 20 22  CHEMA:     z = "
5370: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
5380: 68 61 73 20 63 68 61 6e 67 65 64 22 3b 20 20 20  has changed";   
5390: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
53a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
53b0: 4f 4f 42 49 47 3a 20 20 20 20 20 7a 20 3d 20 22  OOBIG:     z = "
53c0: 74 6f 6f 20 6d 75 63 68 20 64 61 74 61 20 66 6f  too much data fo
53d0: 72 20 6f 6e 65 20 74 61 62 6c 65 20 72 6f 77 22  r one table row"
53e0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
53f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5400: 4f 4e 53 54 52 41 49 4e 54 3a 20 7a 20 3d 20 22  ONSTRAINT: z = "
5410: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
5420: 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d";             
5430: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5440: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
5450: 49 53 4d 41 54 43 48 3a 20 20 20 7a 20 3d 20 22  ISMATCH:   z = "
5460: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
5470: 68 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  h";             
5480: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5490: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
54a0: 49 53 55 53 45 3a 20 20 20 20 20 7a 20 3d 20 22  ISUSE:     z = "
54b0: 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20  library routine 
54c0: 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65  called out of se
54d0: 71 75 65 6e 63 65 22 3b 62 72 65 61 6b 3b 0a 20  quence";break;. 
54e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
54f0: 4f 4c 46 53 3a 20 20 20 20 20 20 7a 20 3d 20 22  OLFS:      z = "
5500: 6b 65 72 6e 65 6c 20 6c 61 63 6b 73 20 6c 61 72  kernel lacks lar
5510: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 22  ge file support"
5520: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
5530: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
5540: 55 54 48 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  UTH:       z = "
5550: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65  authorization de
5560: 6e 69 65 64 22 3b 20 20 20 20 20 20 20 20 20 20  nied";          
5570: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5580: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
5590: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
55a0: 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 20  unknown error"; 
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
55d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
55e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
55f0: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
5600: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
5610: 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20  that sleeps and 
5620: 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75  tries.** again u
5630: 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76  ntil a timeout v
5640: 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e  alue is reached.
5650: 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61    The timeout va
5660: 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74  lue is.** an int
5670: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d  eger number of m
5680: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73  illiseconds pass
5690: 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72  ed in as the fir
56a0: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  st.** argument..
56b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
56c0: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
56d0: 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a  allback(. void *
56e0: 54 69 6d 65 6f 75 74 2c 20 20 20 20 20 20 20 20  Timeout,        
56f0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d     /* Maximum am
5700: 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 74 6f 20  ount of time to 
5710: 77 61 69 74 20 2a 2f 0a 20 63 6f 6e 73 74 20 63  wait */. const c
5720: 68 61 72 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20  har *NotUsed,   
5730: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66    /* The name of
5740: 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
5750: 69 73 20 62 75 73 79 20 2a 2f 0a 20 69 6e 74 20  is busy */. int 
5760: 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20  count           
5770: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5780: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
5790: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29  s been busy */.)
57a0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 49 4e  {.#if SQLITE_MIN
57b0: 5f 53 4c 45 45 50 5f 4d 53 3d 3d 31 0a 20 20 69  _SLEEP_MS==1.  i
57c0: 6e 74 20 64 65 6c 61 79 20 3d 20 31 30 3b 0a 20  nt delay = 10;. 
57d0: 20 69 6e 74 20 70 72 69 6f 72 5f 64 65 6c 61 79   int prior_delay
57e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 74 69 6d 65   = 0;.  int time
57f0: 6f 75 74 20 3d 20 28 69 6e 74 29 54 69 6d 65 6f  out = (int)Timeo
5800: 75 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ut;.  int i;..  
5810: 66 6f 72 28 69 3d 31 3b 20 69 3c 63 6f 75 6e 74  for(i=1; i<count
5820: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 70 72 69  ; i++){ .    pri
5830: 6f 72 5f 64 65 6c 61 79 20 2b 3d 20 64 65 6c 61  or_delay += dela
5840: 79 3b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  y;.    delay = d
5850: 65 6c 61 79 2a 32 3b 0a 20 20 20 20 69 66 28 20  elay*2;.    if( 
5860: 64 65 6c 61 79 3e 3d 31 30 30 30 20 29 7b 0a 20  delay>=1000 ){. 
5870: 20 20 20 20 20 64 65 6c 61 79 20 3d 20 31 30 30       delay = 100
5880: 30 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 5f 64  0;.      prior_d
5890: 65 6c 61 79 20 2b 3d 20 31 30 30 30 2a 28 63 6f  elay += 1000*(co
58a0: 75 6e 74 20 2d 20 69 20 2d 20 31 29 3b 0a 20 20  unt - i - 1);.  
58b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
58c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
58d0: 5f 64 65 6c 61 79 20 2b 20 64 65 6c 61 79 20 3e  _delay + delay >
58e0: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
58f0: 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20  delay = timeout 
5900: 2d 20 70 72 69 6f 72 5f 64 65 6c 61 79 3b 0a 20  - prior_delay;. 
5910: 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20     if( delay<=0 
5920: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
5930: 20 20 73 71 6c 69 74 65 4f 73 53 6c 65 65 70 28    sqliteOsSleep(
5940: 64 65 6c 61 79 29 3b 0a 20 20 72 65 74 75 72 6e  delay);.  return
5950: 20 31 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20   1;.#else.  int 
5960: 74 69 6d 65 6f 75 74 20 3d 20 28 69 6e 74 29 54  timeout = (int)T
5970: 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63  imeout;.  if( (c
5980: 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74  ount+1)*1000 > t
5990: 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65  imeout ){.    re
59a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
59b0: 6c 69 74 65 4f 73 53 6c 65 65 70 28 31 30 30 30  liteOsSleep(1000
59c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
59d0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
59e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
59f0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
5a00: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
5a10: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
5a20: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
5a30: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
5a40: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
5a50: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
5a60: 69 74 65 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  ite_busy_handler
5a70: 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 0a  (.  sqlite *db,.
5a80: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76    int (*xBusy)(v
5a90: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
5aa0: 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
5ab0: 41 72 67 0a 29 7b 0a 20 20 64 62 2d 3e 78 42 75  Arg.){.  db->xBu
5ac0: 73 79 43 61 6c 6c 62 61 63 6b 20 3d 20 78 42 75  syCallback = xBu
5ad0: 73 79 3b 0a 20 20 64 62 2d 3e 70 42 75 73 79 41  sy;.  db->pBusyA
5ae0: 72 67 20 3d 20 70 41 72 67 3b 0a 7d 0a 0a 2f 2a  rg = pArg;.}../*
5af0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5b00: 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61   installs a defa
5b10: 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ult busy handler
5b20: 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20   that waits for 
5b30: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
5b40: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
5b50: 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72  seconds before r
5b60: 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 76  eturning 0..*/.v
5b70: 6f 69 64 20 73 71 6c 69 74 65 5f 62 75 73 79 5f  oid sqlite_busy_
5b80: 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 20 2a  timeout(sqlite *
5b90: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69  db, int ms){.  i
5ba0: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73  f( ms>0 ){.    s
5bb0: 71 6c 69 74 65 5f 62 75 73 79 5f 68 61 6e 64 6c  qlite_busy_handl
5bc0: 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66  er(db, sqliteDef
5bd0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
5be0: 2c 20 28 76 6f 69 64 2a 29 6d 73 29 3b 0a 20 20  , (void*)ms);.  
5bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
5c00: 65 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  e_busy_handler(d
5c10: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  b, 0, 0);.  }.}.
5c20: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
5c30: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
5c40: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
5c50: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
5c60: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
5c70: 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70 74  sqlite_interrupt
5c80: 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20  (sqlite *db){.  
5c90: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
5ca0: 49 54 45 5f 49 6e 74 65 72 72 75 70 74 3b 0a 7d  ITE_Interrupt;.}
5cb0: 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20  ../*.** Windows 
5cc0: 73 79 73 74 65 6d 73 20 73 68 6f 75 6c 64 20 63  systems should c
5cd0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
5ce0: 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72 79 20   to free memory 
5cf0: 74 68 61 74 0a 2a 2a 20 69 73 20 72 65 74 75 72  that.** is retur
5d00: 6e 65 64 20 69 6e 20 74 68 65 20 69 6e 20 74 68  ned in the in th
5d10: 65 20 65 72 72 6d 73 67 20 70 61 72 61 6d 65 74  e errmsg paramet
5d20: 65 72 20 6f 66 20 73 71 6c 69 74 65 5f 6f 70 65  er of sqlite_ope
5d30: 6e 28 29 20 77 68 65 6e 0a 2a 2a 20 53 51 4c 69  n() when.** SQLi
5d40: 74 65 20 69 73 20 61 20 44 4c 4c 2e 20 20 46 6f  te is a DLL.  Fo
5d50: 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 2c 20 69  r some reason, i
5d60: 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  t does not work 
5d70: 74 6f 20 63 61 6c 6c 20 66 72 65 65 28 29 0a 2a  to call free().*
5d80: 2a 20 64 69 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a  * directly..**.*
5d90: 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 6e  * Note that we n
5da0: 65 65 64 20 74 6f 20 63 61 6c 6c 20 66 72 65 65  eed to call free
5db0: 28 29 20 6e 6f 74 20 73 71 6c 69 74 65 46 72 65  () not sqliteFre
5dc0: 65 28 29 20 68 65 72 65 2c 20 73 69 6e 63 65 20  e() here, since 
5dd0: 65 76 65 72 79 0a 2a 2a 20 73 74 72 69 6e 67 20  every.** string 
5de0: 74 68 61 74 20 69 73 20 65 78 70 6f 72 74 65 64  that is exported
5df0: 20 66 72 6f 6d 20 53 51 4c 69 74 65 20 73 68 6f   from SQLite sho
5e00: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
5e10: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 0a   passed through.
5e20: 2a 2a 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c  ** sqliteStrReal
5e30: 6c 6f 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  loc()..*/.void s
5e40: 71 6c 69 74 65 5f 66 72 65 65 6d 65 6d 28 76 6f  qlite_freemem(vo
5e50: 69 64 20 2a 70 29 7b 20 66 72 65 65 28 70 29 3b  id *p){ free(p);
5e60: 20 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77   }../*.** Window
5e70: 73 20 73 79 73 74 65 6d 73 20 6e 65 65 64 20 66  s systems need f
5e80: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 63 61 6c 6c  unctions to call
5e90: 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 73   to return the s
5ea0: 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 0a 2a 2a  qlite_version.**
5eb0: 20 61 6e 64 20 73 71 6c 69 74 65 5f 65 6e 63 6f   and sqlite_enco
5ec0: 64 69 6e 67 20 73 74 72 69 6e 67 73 20 73 69 6e  ding strings sin
5ed0: 63 65 20 74 68 65 79 20 61 72 65 20 75 6e 61 62  ce they are unab
5ee0: 6c 65 20 74 6f 20 61 63 63 65 73 73 20 63 6f 6e  le to access con
5ef0: 73 74 61 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  stants.** within
5f00: 20 44 4c 4c 73 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   DLLs..*/.const 
5f10: 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 6c 69 62  char *sqlite_lib
5f20: 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 7b 20 72  version(void){ r
5f30: 65 74 75 72 6e 20 73 71 6c 69 74 65 5f 76 65 72  eturn sqlite_ver
5f40: 73 69 6f 6e 3b 20 7d 0a 63 6f 6e 73 74 20 63 68  sion; }.const ch
5f50: 61 72 20 2a 73 71 6c 69 74 65 5f 6c 69 62 65 6e  ar *sqlite_liben
5f60: 63 6f 64 69 6e 67 28 76 6f 69 64 29 7b 20 72 65  coding(void){ re
5f70: 74 75 72 6e 20 73 71 6c 69 74 65 5f 65 6e 63 6f  turn sqlite_enco
5f80: 64 69 6e 67 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ding; }../*.** C
5f90: 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 2d 64  reate new user-d
5fa0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
5fb0: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 5f 63 72  .  The sqlite_cr
5fc0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 0a  eate_function().
5fd0: 2a 2a 20 72 6f 75 74 69 6e 65 20 63 72 65 61 74  ** routine creat
5fe0: 65 73 20 61 20 72 65 67 75 6c 61 72 20 66 75 6e  es a regular fun
5ff0: 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
6000: 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
6010: 65 28 29 0a 2a 2a 20 63 72 65 61 74 65 73 20 61  e().** creates a
6020: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
6030: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 73 73  tion..**.** Pass
6040: 69 6e 67 20 61 20 4e 55 4c 4c 20 78 46 75 6e 63  ing a NULL xFunc
6050: 20 61 72 67 75 6d 65 6e 74 20 6f 72 20 4e 55 4c   argument or NUL
6060: 4c 20 78 53 74 65 70 20 61 6e 64 20 78 46 69 6e  L xStep and xFin
6070: 61 6c 69 7a 65 20 61 72 67 75 6d 65 6e 74 73 0a  alize arguments.
6080: 2a 2a 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ** disables the 
6090: 66 75 6e 63 74 69 6f 6e 2e 20 20 43 61 6c 6c 69  function.  Calli
60a0: 6e 67 20 73 71 6c 69 74 65 5f 63 72 65 61 74 65  ng sqlite_create
60b0: 5f 66 75 6e 63 74 69 6f 6e 28 29 20 77 69 74 68  _function() with
60c0: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 6e 61 6d   the.** same nam
60d0: 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
60e0: 61 72 67 75 6d 65 6e 74 73 20 61 73 20 61 20 70  arguments as a p
60f0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  rior call to.** 
6100: 73 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 61 67  sqlite_create_ag
6110: 67 72 65 67 61 74 65 28 29 20 64 69 73 61 62 6c  gregate() disabl
6120: 65 73 20 74 68 65 20 70 72 69 6f 72 20 63 61 6c  es the prior cal
6130: 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 5f 63  l to.** sqlite_c
6140: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 28  reate_aggregate(
6150: 29 2c 20 61 6e 64 20 76 69 63 65 20 76 65 72 73  ), and vice vers
6160: 61 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 41 72 67  a..**.** If nArg
6170: 20 69 73 20 2d 31 20 69 74 20 6d 65 61 6e 73 20   is -1 it means 
6180: 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
6190: 6f 6e 20 77 69 6c 6c 20 61 63 63 65 70 74 20 61  on will accept a
61a0: 6e 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  ny number.** of 
61b0: 61 72 67 75 6d 65 6e 74 73 2c 20 69 6e 63 6c 75  arguments, inclu
61c0: 64 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  ding 0..*/.int s
61d0: 71 6c 69 74 65 5f 63 72 65 61 74 65 5f 66 75 6e  qlite_create_fun
61e0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 20  ction(.  sqlite 
61f0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *db,          /*
6200: 20 41 64 64 20 74 68 65 20 66 75 6e 63 74 69 6f   Add the functio
6210: 6e 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  n to this databa
6220: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
6230: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6240: 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  Name,   /* Name 
6250: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
6260: 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20  to add */.  int 
6270: 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
6280: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
6290: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 76 6f 69  guments */.  voi
62a0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
62b0: 65 5f 66 75 6e 63 2a 2c 69 6e 74 2c 63 6f 6e 73  e_func*,int,cons
62c0: 74 20 63 68 61 72 2a 2a 29 2c 20 20 2f 2a 20 54  t char**),  /* T
62d0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
62e0: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 55 73  n */.  void *pUs
62f0: 65 72 44 61 74 61 20 20 20 20 20 20 2f 2a 20 55  erData      /* U
6300: 73 65 72 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20  ser data */.){. 
6310: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
6320: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 66 28 20  nt nName;.  if( 
6330: 64 62 3d 3d 30 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  db==0 || zName==
6340: 30 20 7c 7c 20 73 71 6c 69 74 65 53 61 66 65 74  0 || sqliteSafet
6350: 79 43 68 65 63 6b 28 64 62 29 20 29 20 72 65 74  yCheck(db) ) ret
6360: 75 72 6e 20 31 3b 0a 20 20 6e 4e 61 6d 65 20 3d  urn 1;.  nName =
6370: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
6380: 20 20 69 66 28 20 6e 4e 61 6d 65 3e 32 35 35 20    if( nName>255 
6390: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 20  ) return 1;.  p 
63a0: 3d 20 73 71 6c 69 74 65 46 69 6e 64 46 75 6e 63  = sqliteFindFunc
63b0: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
63c0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 31 29 3b  nName, nArg, 1);
63d0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
63e0: 74 75 72 6e 20 31 3b 0a 20 20 70 2d 3e 78 46 75  turn 1;.  p->xFu
63f0: 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d  nc = xFunc;.  p-
6400: 3e 78 53 74 65 70 20 3d 20 30 3b 0a 20 20 70 2d  >xStep = 0;.  p-
6410: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 30 3b 0a  >xFinalize = 0;.
6420: 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d    p->pUserData =
6430: 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 72 65   pUserData;.  re
6440: 74 75 72 6e 20 30 3b 0a 7d 0a 69 6e 74 20 73 71  turn 0;.}.int sq
6450: 6c 69 74 65 5f 63 72 65 61 74 65 5f 61 67 67 72  lite_create_aggr
6460: 65 67 61 74 65 28 0a 20 20 73 71 6c 69 74 65 20  egate(.  sqlite 
6470: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *db,          /*
6480: 20 41 64 64 20 74 68 65 20 66 75 6e 63 74 69 6f   Add the functio
6490: 6e 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  n to this databa
64a0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
64b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
64c0: 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  Name,   /* Name 
64d0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
64e0: 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20  to add */.  int 
64f0: 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
6500: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
6510: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 76 6f 69  guments */.  voi
6520: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
6530: 65 5f 66 75 6e 63 2a 2c 69 6e 74 2c 63 6f 6e 73  e_func*,int,cons
6540: 74 20 63 68 61 72 2a 2a 29 2c 20 2f 2a 20 54 68  t char**), /* Th
6550: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  e step function 
6560: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  */.  void (*xFin
6570: 61 6c 69 7a 65 29 28 73 71 6c 69 74 65 5f 66 75  alize)(sqlite_fu
6580: 6e 63 2a 29 2c 20 20 20 20 20 20 20 20 20 20 20  nc*),           
6590: 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 69     /* The finali
65a0: 7a 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  zer */.  void *p
65b0: 55 73 65 72 44 61 74 61 20 20 20 20 20 20 2f 2a  UserData      /*
65c0: 20 55 73 65 72 20 64 61 74 61 20 2a 2f 0a 29 7b   User data */.){
65d0: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
65e0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 66   int nName;.  if
65f0: 28 20 64 62 3d 3d 30 20 7c 7c 20 7a 4e 61 6d 65  ( db==0 || zName
6600: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 53 61 66  ==0 || sqliteSaf
6610: 65 74 79 43 68 65 63 6b 28 64 62 29 20 29 20 72  etyCheck(db) ) r
6620: 65 74 75 72 6e 20 31 3b 0a 20 20 6e 4e 61 6d 65  eturn 1;.  nName
6630: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
6640: 3b 0a 20 20 69 66 28 20 6e 4e 61 6d 65 3e 32 35  ;.  if( nName>25
6650: 35 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  5 ) return 1;.  
6660: 70 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 46 75  p = sqliteFindFu
6670: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
6680: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 31  , nName, nArg, 1
6690: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
66a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 2d 3e 78  return 1;.  p->x
66b0: 46 75 6e 63 20 3d 20 30 3b 0a 20 20 70 2d 3e 78  Func = 0;.  p->x
66c0: 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20  Step = xStep;.  
66d0: 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78  p->xFinalize = x
66e0: 46 69 6e 61 6c 69 7a 65 3b 0a 20 20 70 2d 3e 70  Finalize;.  p->p
66f0: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
6700: 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30  Data;.  return 0
6710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
6720: 65 20 74 68 65 20 64 61 74 61 74 79 70 65 20 66  e the datatype f
6730: 6f 72 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73  or all functions
6740: 20 77 69 74 68 20 61 20 67 69 76 65 6e 20 6e 61   with a given na
6750: 6d 65 2e 20 20 53 65 65 20 74 68 65 0a 2a 2a 20  me.  See the.** 
6760: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
6770: 6f 72 20 74 68 65 20 70 72 6f 74 6f 74 79 70 65  or the prototype
6780: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
6790: 6e 20 69 6e 20 73 71 6c 69 74 65 2e 68 20 66 6f  n in sqlite.h fo
67a0: 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20  r.** additional 
67b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
67c0: 69 6e 74 20 73 71 6c 69 74 65 5f 66 75 6e 63 74  int sqlite_funct
67d0: 69 6f 6e 5f 74 79 70 65 28 73 71 6c 69 74 65 20  ion_type(sqlite 
67e0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
67f0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 61 74 61  *zName, int data
6800: 54 79 70 65 29 7b 0a 20 20 46 75 6e 63 44 65 66  Type){.  FuncDef
6810: 20 2a 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29   *p = (FuncDef*)
6820: 73 71 6c 69 74 65 48 61 73 68 46 69 6e 64 28 26  sqliteHashFind(&
6830: 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65  db->aFunc, zName
6840: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29  , strlen(zName))
6850: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
6860: 20 20 20 20 70 2d 3e 64 61 74 61 54 79 70 65 20      p->dataType 
6870: 3d 20 64 61 74 61 54 79 70 65 3b 20 0a 20 20 20  = dataType; .   
6880: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
6890: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
68a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
68b0: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
68c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
68d0: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
68e0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
68f0: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
6900: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
6910: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
6920: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
6930: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
6940: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
6950: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
6960: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
6970: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
6980: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
6990: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
69a0: 2a 2a 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29  ** sqlite_exec()
69b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
69c0: 65 5f 74 72 61 63 65 28 73 71 6c 69 74 65 20 2a  e_trace(sqlite *
69d0: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
69e0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
69f0: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
6a00: 67 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g){.#ifndef SQLI
6a10: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20  TE_OMIT_TRACE.  
6a20: 76 6f 69 64 20 2a 70 4f 6c 64 20 3d 20 64 62 2d  void *pOld = db-
6a30: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
6a40: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
6a50: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
6a60: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 72 65 74  rg = pArg;.  ret
6a70: 75 72 6e 20 70 4f 6c 64 3b 0a 23 65 6c 73 65 0a  urn pOld;.#else.
6a80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
6a90: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  if.}.../*.** Att
6aa0: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74 68 65  empt to open the
6ab0: 20 66 69 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74   file named in t
6ac0: 68 65 20 61 72 67 75 6d 65 6e 74 20 61 73 20 74  he argument as t
6ad0: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
6ae0: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 2e 20 20  abase.** file.  
6af0: 54 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  The auxiliary da
6b00: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
6b10: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 54 45 4d  sed to store TEM
6b20: 50 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a  P tables.  But.*
6b30: 2a 20 62 79 20 75 73 69 6e 67 20 74 68 69 73 20  * by using this 
6b40: 41 50 49 2c 20 69 74 20 69 73 20 70 6f 73 73 69  API, it is possi
6b50: 62 6c 65 20 74 6f 20 74 72 69 63 6b 20 53 51 4c  ble to trick SQL
6b60: 69 74 65 20 69 6e 74 6f 20 6f 70 65 6e 69 6e 67  ite into opening
6b70: 20 74 77 6f 0a 2a 2a 20 73 65 70 61 72 61 74 65   two.** separate
6b80: 20 64 61 74 61 62 61 73 65 73 20 61 6e 64 20 61   databases and a
6b90: 63 74 69 6e 67 20 6f 6e 20 74 68 65 6d 20 61 73  cting on them as
6ba0: 20 69 66 20 74 68 65 79 20 77 65 72 65 20 6f 6e   if they were on
6bb0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
6bc0: 75 74 69 6e 65 20 63 6c 6f 73 65 73 20 74 68 65  utine closes the
6bd0: 20 65 78 69 73 74 69 6e 67 20 61 75 78 69 6c 69   existing auxili
6be0: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ary database fil
6bf0: 65 2c 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  e, which will.**
6c00: 20 63 61 75 73 65 20 61 6e 79 20 70 72 65 76 69   cause any previ
6c10: 6f 75 73 6c 79 20 63 72 65 61 74 65 64 20 54 45  ously created TE
6c20: 4d 50 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  MP tables to be 
6c30: 64 72 6f 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  dropped..**.** T
6c40: 68 65 20 7a 4e 61 6d 65 20 70 61 72 61 6d 65 74  he zName paramet
6c50: 65 72 20 63 61 6e 20 62 65 20 61 20 4e 55 4c 4c  er can be a NULL
6c60: 20 70 6f 69 6e 74 65 72 20 6f 72 20 61 6e 20 65   pointer or an e
6c70: 6d 70 74 79 20 73 74 72 69 6e 67 20 74 6f 20 63  mpty string to c
6c80: 61 75 73 65 0a 2a 2a 20 61 20 74 65 6d 70 6f 72  ause.** a tempor
6c90: 61 72 79 20 66 69 6c 65 20 74 6f 20 62 65 20 6f  ary file to be o
6ca0: 70 65 6e 65 64 20 61 6e 64 20 61 75 74 6f 6d 61  pened and automa
6cb0: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
6cc0: 77 68 65 6e 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  when closed..*/.
6cd0: 69 6e 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  int sqlite_open_
6ce0: 61 75 78 5f 66 69 6c 65 28 73 71 6c 69 74 65 20  aux_file(sqlite 
6cf0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
6d00: 2a 7a 4e 61 6d 65 2c 20 63 68 61 72 20 2a 2a 70  *zName, char **p
6d10: 7a 45 72 72 4d 73 67 29 7b 0a 20 20 69 6e 74 20  zErrMsg){.  int 
6d20: 72 63 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  rc;.  if( zName 
6d30: 26 26 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  && zName[0]==0 )
6d40: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 66   zName = 0;.  if
6d50: 28 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 6e  ( sqliteSafetyOn
6d60: 28 64 62 29 20 29 20 67 6f 74 6f 20 6f 70 65 6e  (db) ) goto open
6d70: 61 75 78 5f 6d 69 73 75 73 65 3b 0a 20 20 73 71  aux_misuse;.  sq
6d80: 6c 69 74 65 52 65 73 65 74 49 6e 74 65 72 6e 61  liteResetInterna
6d90: 6c 53 63 68 65 6d 61 28 64 62 29 3b 0a 20 20 69  lSchema(db);.  i
6da0: 66 28 20 64 62 2d 3e 70 42 65 54 65 6d 70 21 3d  f( db->pBeTemp!=
6db0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 42  0 ){.    sqliteB
6dc0: 74 72 65 65 43 6c 6f 73 65 28 64 62 2d 3e 70 42  treeClose(db->pB
6dd0: 65 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 72 63  eTemp);.  }.  rc
6de0: 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65 4f 70   = sqliteBtreeOp
6df0: 65 6e 28 7a 4e 61 6d 65 2c 20 30 2c 20 4d 41 58  en(zName, 0, MAX
6e00: 5f 50 41 47 45 53 2c 20 26 64 62 2d 3e 70 42 65  _PAGES, &db->pBe
6e10: 54 65 6d 70 29 3b 0a 20 20 69 66 28 20 72 63 20  Temp);.  if( rc 
6e20: 29 7b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  ){.    if( zName
6e30: 3d 3d 30 20 29 20 7a 4e 61 6d 65 20 3d 20 22 61  ==0 ) zName = "a
6e40: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 22   temporary file"
6e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
6e60: 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20  tring(pzErrMsg, 
6e70: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
6e80: 22 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  ", zName, .     
6e90: 20 22 3a 20 22 2c 20 73 71 6c 69 74 65 5f 65 72   ": ", sqlite_er
6ea0: 72 6f 72 5f 73 74 72 69 6e 67 28 72 63 29 2c 20  ror_string(rc), 
6eb0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 74  0);.    sqliteSt
6ec0: 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73  rRealloc(pzErrMs
6ed0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 61  g);.    sqliteSa
6ee0: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
6ef0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6f00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69    rc = sqliteIni
6f10: 74 28 64 62 2c 20 70 7a 45 72 72 4d 73 67 29 3b  t(db, pzErrMsg);
6f20: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 53 61 66  .  if( sqliteSaf
6f30: 65 74 79 4f 66 66 28 64 62 29 20 29 20 67 6f 74  etyOff(db) ) got
6f40: 6f 20 6f 70 65 6e 61 75 78 5f 6d 69 73 75 73 65  o openaux_misuse
6f50: 3b 0a 20 20 73 71 6c 69 74 65 53 74 72 52 65 61  ;.  sqliteStrRea
6f60: 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a  lloc(pzErrMsg);.
6f70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 6f 70    return rc;..op
6f80: 65 6e 61 75 78 5f 6d 69 73 75 73 65 3a 0a 20 20  enaux_misuse:.  
6f90: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
6fa0: 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  pzErrMsg, sqlite
6fb0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 51  _error_string(SQ
6fc0: 4c 49 54 45 5f 4d 49 53 55 53 45 29 2c 20 30 29  LITE_MISUSE), 0)
6fd0: 3b 0a 20 20 73 71 6c 69 74 65 53 74 72 52 65 61  ;.  sqliteStrRea
6fe0: 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a  lloc(pzErrMsg);.
6ff0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7000: 4d 49 53 55 53 45 3b 0a 7d 0a                    MISUSE;.}.