/ Hex Artifact Content
Login

Artifact 00a9f5603e130fc0b1a05f731731c9c99ebdc2dc:


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 35 32 20 32 30 30 31 2f 31 32 2f  ,v 1.52 2001/12/
0280: 32 31 20 31 34 3a 33 30 3a 34 33 20 64 72 68 20  21 14:30:43 drh 
0290: 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64  Exp $.*/.#includ
02a0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
02b0: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
02c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
02d0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
02e0: 69 6e 65 20 66 6f 72 20 74 68 65 20 63 6f 64 65  ine for the code
02f0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
0300: 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  s the.** databas
0310: 65 2e 20 20 53 65 65 20 73 71 6c 69 74 65 49 6e  e.  See sqliteIn
0320: 69 74 28 29 20 62 65 6c 6f 77 20 66 6f 72 20 61  it() below for a
0330: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
0340: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ation..**.** Eac
0350: 68 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e 74 61  h callback conta
0360: 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ins the followin
0370: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a  g information:.*
0380: 2a 0a 2a 2a 20 20 20 20 20 61 72 67 76 5b 30 5d  *.**     argv[0]
0390: 20 3d 20 22 66 69 6c 65 2d 66 6f 72 6d 61 74 22   = "file-format"
03a0: 20 6f 72 20 22 73 63 68 65 6d 61 2d 63 6f 6f 6b   or "schema-cook
03b0: 69 65 22 20 6f 72 20 22 74 61 62 6c 65 22 20 6f  ie" or "table" o
03c0: 72 20 22 69 6e 64 65 78 22 0a 2a 2a 20 20 20 20  r "index".**    
03d0: 20 61 72 67 76 5b 31 5d 20 3d 20 74 61 62 6c 65   argv[1] = table
03e0: 20 6f 72 20 69 6e 64 65 78 20 6e 61 6d 65 20 6f   or index name o
03f0: 72 20 6d 65 74 61 20 73 74 61 74 65 6d 65 6e 74  r meta statement
0400: 20 74 79 70 65 2e 0a 2a 2a 20 20 20 20 20 61 72   type..**     ar
0410: 67 76 5b 32 5d 20 3d 20 72 6f 6f 74 20 70 61 67  gv[2] = root pag
0420: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61 62  e number for tab
0430: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 20 20 4e 55  le or index.  NU
0440: 4c 4c 20 66 6f 72 20 6d 65 74 61 2e 0a 2a 2a 20  LL for meta..** 
0450: 20 20 20 20 61 72 67 76 5b 33 5d 20 3d 20 53 51      argv[3] = SQ
0460: 4c 20 63 72 65 61 74 65 20 73 74 61 74 65 6d 65  L create stateme
0470: 6e 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  nt for the table
0480: 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2f 0a   or index.**.*/.
0490: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
04a0: 65 4f 70 65 6e 43 62 28 76 6f 69 64 20 2a 70 44  eOpenCb(void *pD
04b0: 62 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61  b, int argc, cha
04c0: 72 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a  r **argv, char *
04d0: 2a 61 7a 43 6f 6c 4e 61 6d 65 29 7b 0a 20 20 73  *azColName){.  s
04e0: 71 6c 69 74 65 20 2a 64 62 20 3d 20 28 73 71 6c  qlite *db = (sql
04f0: 69 74 65 2a 29 70 44 62 3b 0a 20 20 50 61 72 73  ite*)pDb;.  Pars
0500: 65 20 73 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  e sParse;.  int 
0510: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  nErr = 0;..  /* 
0520: 54 4f 44 4f 3a 20 44 6f 20 73 6f 6d 65 20 76 61  TODO: Do some va
0530: 6c 69 64 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  lidity checks on
0540: 20 61 6c 6c 20 66 69 65 6c 64 73 2e 20 20 49 6e   all fields.  In
0550: 20 70 61 72 74 69 63 75 6c 61 72 2c 0a 20 20 2a   particular,.  *
0560: 2a 20 6d 61 6b 65 20 73 75 72 65 20 66 69 65 6c  * make sure fiel
0570: 64 73 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  ds do not contai
0580: 6e 20 4e 55 4c 4c 73 2e 20 4f 74 68 65 72 77 69  n NULLs. Otherwi
0590: 73 65 20 77 65 20 6d 69 67 68 74 20 63 6f 72 65  se we might core
05a0: 0a 20 20 2a 2a 20 77 68 65 6e 20 61 74 74 65 6d  .  ** when attem
05b0: 70 74 69 6e 67 20 74 6f 20 69 6e 69 74 69 61 6c  pting to initial
05c0: 69 7a 65 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ize from a corru
05d0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
05e0: 2e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  . */..  assert( 
05f0: 61 72 67 63 3d 3d 34 20 29 3b 0a 20 20 73 77 69  argc==4 );.  swi
0600: 74 63 68 28 20 61 72 67 76 5b 30 5d 5b 30 5d 20  tch( argv[0][0] 
0610: 29 7b 0a 20 20 20 20 63 61 73 65 20 27 66 27 3a  ){.    case 'f':
0620: 20 7b 20 20 2f 2a 20 46 69 6c 65 20 66 6f 72 6d   {  /* File form
0630: 61 74 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  at */.      db->
0640: 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 61 74  file_format = at
0650: 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20  oi(argv[3]);.   
0660: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
0670: 20 20 20 20 63 61 73 65 20 27 73 27 3a 20 7b 20      case 's': { 
0680: 2f 2a 20 53 63 68 65 6d 61 20 63 6f 6f 6b 69 65  /* Schema cookie
0690: 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 73 63   */.      db->sc
06a0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 20 3d 20 61 74  hema_cookie = at
06b0: 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20  oi(argv[3]);.   
06c0: 20 20 20 64 62 2d 3e 6e 65 78 74 5f 63 6f 6f 6b     db->next_cook
06d0: 69 65 20 3d 20 64 62 2d 3e 73 63 68 65 6d 61 5f  ie = db->schema_
06e0: 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 62 72  cookie;.      br
06f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
0700: 61 73 65 20 27 69 27 3a 0a 20 20 20 20 63 61 73  ase 'i':.    cas
0710: 65 20 27 74 27 3a 20 7b 20 20 2f 2a 20 43 52 45  e 't': {  /* CRE
0720: 41 54 45 20 54 41 42 4c 45 20 20 61 6e 64 20 43  ATE TABLE  and C
0730: 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
0740: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
0750: 69 66 28 20 61 72 67 76 5b 33 5d 20 26 26 20 61  if( argv[3] && a
0760: 72 67 76 5b 33 5d 5b 30 5d 20 29 7b 0a 20 20 20  rgv[3][0] ){.   
0770: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65       /* Call the
0780: 20 70 61 72 73 65 72 20 74 6f 20 70 72 6f 63 65   parser to proce
0790: 73 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ss a CREATE TABL
07a0: 45 20 6f 72 20 43 52 45 41 54 45 20 49 4e 44 45  E or CREATE INDE
07b0: 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  X statement..   
07c0: 20 20 20 20 20 2a 2a 20 42 75 74 20 62 65 63 61       ** But beca
07d0: 75 73 65 20 73 50 61 72 73 65 2e 69 6e 69 74 46  use sParse.initF
07e0: 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
07f0: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 69 73   no VDBE code is
0800: 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 20   generated.     
0810: 20 20 20 2a 2a 20 6f 72 20 65 78 65 63 75 74 65     ** or execute
0820: 64 2e 20 20 41 6c 6c 20 74 68 65 20 70 61 72 73  d.  All the pars
0830: 65 72 20 64 6f 65 73 20 69 73 20 62 75 69 6c 64  er does is build
0840: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 61   the internal da
0850: 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  ta.        ** st
0860: 72 75 63 74 75 72 65 73 20 74 68 61 74 20 64 65  ructures that de
0870: 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c 65  scribe the table
0880: 20 6f 72 20 69 6e 64 65 78 2e 0a 20 20 20 20 20   or index..     
0890: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
08a0: 6d 73 65 74 28 26 73 50 61 72 73 65 2c 20 30 2c  mset(&sParse, 0,
08b0: 20 73 69 7a 65 6f 66 28 73 50 61 72 73 65 29 29   sizeof(sParse))
08c0: 3b 0a 20 20 20 20 20 20 20 20 73 50 61 72 73 65  ;.        sParse
08d0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  .db = db;.      
08e0: 20 20 73 50 61 72 73 65 2e 69 6e 69 74 46 6c 61    sParse.initFla
08f0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  g = 1;.        s
0900: 50 61 72 73 65 2e 6e 65 77 54 6e 75 6d 20 3d 20  Parse.newTnum = 
0910: 61 74 6f 69 28 61 72 67 76 5b 32 5d 29 3b 0a 20  atoi(argv[2]);. 
0920: 20 20 20 20 20 20 20 73 71 6c 69 74 65 52 75 6e         sqliteRun
0930: 50 61 72 73 65 72 28 26 73 50 61 72 73 65 2c 20  Parser(&sParse, 
0940: 61 72 67 76 5b 33 5d 2c 20 30 29 3b 0a 20 20 20  argv[3], 0);.   
0950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0960: 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 20    /* If the SQL 
0970: 63 6f 6c 75 6d 6e 20 69 73 20 62 6c 61 6e 6b 20  column is blank 
0980: 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73  it means this is
0990: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 0a 20   an index that. 
09a0: 20 20 20 20 20 20 20 2a 2a 20 77 61 73 20 63 72         ** was cr
09b0: 65 61 74 65 64 20 74 6f 20 62 65 20 74 68 65 20  eated to be the 
09c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 74  PRIMARY KEY or t
09d0: 6f 20 66 75 6c 66 69 6c 6c 20 61 20 55 4e 49 51  o fulfill a UNIQ
09e0: 55 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  UE.        ** co
09f0: 6e 73 74 72 61 69 6e 74 20 6f 72 20 61 20 43 52  nstraint or a CR
0a00: 45 41 54 45 20 54 41 42 4c 45 2e 20 20 54 68 65  EATE TABLE.  The
0a10: 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 68 61   index should ha
0a20: 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  ve already.     
0a30: 20 20 20 2a 2a 20 62 65 65 6e 20 63 72 65 61 74     ** been creat
0a40: 65 64 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65  ed when we proce
0a50: 73 73 65 64 20 74 68 65 20 43 52 45 41 54 45 20  ssed the CREATE 
0a60: 54 41 42 4c 45 2e 20 20 41 6c 6c 20 77 65 20 68  TABLE.  All we h
0a70: 61 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ave.        ** t
0a80: 6f 20 64 6f 20 68 65 72 65 20 69 73 20 72 65 63  o do here is rec
0a90: 6f 72 64 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ord the root pag
0aa0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
0ab0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e        Index *pIn
0ac0: 64 65 78 20 3d 20 73 71 6c 69 74 65 46 69 6e 64  dex = sqliteFind
0ad0: 49 6e 64 65 78 28 64 62 2c 20 61 72 67 76 5b 31  Index(db, argv[1
0ae0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
0af0: 70 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 70 49 6e  pIndex==0 || pIn
0b00: 64 65 78 2d 3e 74 6e 75 6d 21 3d 30 20 29 7b 0a  dex->tnum!=0 ){.
0b10: 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b            nErr++
0b20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
0b30: 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65  .          pInde
0b40: 78 2d 3e 74 6e 75 6d 20 3d 20 61 74 6f 69 28 61  x->tnum = atoi(a
0b50: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[2]);.       
0b60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
0b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
0b80: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
0b90: 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6e 20 6e     /* This can n
0ba0: 6f 74 20 68 61 70 70 65 6e 21 20 2a 2f 0a 20 20  ot happen! */.  
0bb0: 20 20 20 20 6e 45 72 72 20 3d 20 31 3b 0a 20 20      nErr = 1;.  
0bc0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 72 72      assert( nErr
0bd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ==0 );.    }.  }
0be0: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a  .  return nErr;.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
0c00: 20 74 6f 20 72 65 61 64 20 74 68 65 20 64 61 74   to read the dat
0c10: 61 62 61 73 65 20 73 63 68 65 6d 61 20 61 6e 64  abase schema and
0c20: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 6e 74 65   initialize inte
0c30: 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 73 74 72  rnal.** data str
0c40: 75 63 74 75 72 65 73 2e 20 20 52 65 74 75 72 6e  uctures.  Return
0c50: 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49   one of the SQLI
0c60: 54 45 5f 20 65 72 72 6f 72 20 63 6f 64 65 73 20  TE_ error codes 
0c70: 74 6f 0a 2a 2a 20 69 6e 64 69 63 61 74 65 20 73  to.** indicate s
0c80: 75 63 63 65 73 73 20 6f 72 20 66 61 69 6c 75 72  uccess or failur
0c90: 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
0ca0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
0cb0: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 20  nitialized, the 
0cc0: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
0cd0: 65 64 0a 2a 2a 20 62 69 74 20 69 73 20 73 65 74  ed.** bit is set
0ce0: 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 66 69   in the flags fi
0cf0: 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74  eld of the sqlit
0d00: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 41 6e  e structure.  An
0d10: 0a 2a 2a 20 61 74 74 65 6d 70 74 20 69 73 20 6d  .** attempt is m
0d20: 61 64 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ade to initializ
0d30: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
0d40: 73 20 73 6f 6f 6e 20 61 73 20 69 74 0a 2a 2a 20  s soon as it.** 
0d50: 69 73 20 6f 70 65 6e 65 64 2e 20 20 49 66 20 74  is opened.  If t
0d60: 68 61 74 20 66 61 69 6c 73 20 28 70 65 72 68 61  hat fails (perha
0d70: 70 73 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  ps because anoth
0d80: 65 72 20 70 72 6f 63 65 73 73 0a 2a 2a 20 68 61  er process.** ha
0d90: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
0da0: 74 65 72 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64  ter table locked
0db0: 29 20 74 68 61 6e 20 61 6e 6f 74 68 65 72 20 61  ) than another a
0dc0: 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
0dd0: 65 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  e the first time
0de0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
0df0: 20 61 63 63 65 73 73 65 64 2e 0a 2a 2f 0a 73 74   accessed..*/.st
0e00: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 49  atic int sqliteI
0e10: 6e 69 74 28 73 71 6c 69 74 65 20 2a 64 62 2c 20  nit(sqlite *db, 
0e20: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29  char **pzErrMsg)
0e30: 7b 0a 20 20 56 64 62 65 20 2a 76 64 62 65 3b 0a  {.  Vdbe *vdbe;.
0e40: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 0a    int rc;..  /*.
0e50: 20 20 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20    ** The master 
0e60: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 68  database table h
0e70: 61 73 20 61 20 73 74 72 75 63 74 75 72 65 20 6c  as a structure l
0e80: 69 6b 65 20 74 68 69 73 0a 20 20 2a 2f 0a 20 20  ike this.  */.  
0e90: 73 74 61 74 69 63 20 63 68 61 72 20 6d 61 73 74  static char mast
0ea0: 65 72 5f 73 63 68 65 6d 61 5b 5d 20 3d 20 0a 20  er_schema[] = . 
0eb0: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
0ec0: 45 20 22 20 4d 41 53 54 45 52 5f 4e 41 4d 45 20  E " MASTER_NAME 
0ed0: 22 20 28 5c 6e 22 0a 20 20 20 20 20 22 20 20 74  " (\n".     "  t
0ee0: 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ype text,\n".   
0ef0: 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c    "  name text,\
0f00: 6e 22 0a 20 20 20 20 20 22 20 20 74 62 6c 5f 6e  n".     "  tbl_n
0f10: 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
0f20: 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69 6e    "  rootpage in
0f30: 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20 22  teger,\n".     "
0f40: 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20    sql text\n".  
0f50: 20 20 20 22 29 22 0a 20 20 3b 0a 0a 20 20 2f 2a     ")".  ;..  /*
0f60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
0f70: 72 6f 67 72 61 6d 20 69 73 20 75 73 65 64 20 74  rogram is used t
0f80: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0f90: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 73   internal.  ** s
0fa0: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 69 6e 67  tructure holding
0fb0: 20 74 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20   the tables and 
0fc0: 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 64  indexes of the d
0fd0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 54 68  atabase..  ** Th
0fe0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
0ff0: 69 6e 73 20 61 20 73 70 65 63 69 61 6c 20 74 61  ins a special ta
1000: 62 6c 65 20 6e 61 6d 65 64 20 22 73 71 6c 69 74  ble named "sqlit
1010: 65 5f 6d 61 73 74 65 72 22 0a 20 20 2a 2a 20 64  e_master".  ** d
1020: 65 66 69 6e 65 64 20 61 73 20 66 6f 6c 6c 6f 77  efined as follow
1030: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
1040: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c  CREATE TABLE sql
1050: 69 74 65 5f 6d 61 73 74 65 72 20 28 0a 20 20 2a  ite_master (.  *
1060: 2a 20 20 20 20 20 20 20 20 74 79 70 65 20 20 20  *        type   
1070: 20 20 20 20 74 65 78 74 2c 20 20 20 20 2d 2d 20      text,    -- 
1080: 20 45 69 74 68 65 72 20 22 74 61 62 6c 65 22 20   Either "table" 
1090: 6f 72 20 22 69 6e 64 65 78 22 20 6f 72 20 22 6d  or "index" or "m
10a0: 65 74 61 22 0a 20 20 2a 2a 20 20 20 20 20 20 20  eta".  **       
10b0: 20 6e 61 6d 65 20 20 20 20 20 20 20 74 65 78 74   name       text
10c0: 2c 20 20 20 20 2d 2d 20 20 4e 61 6d 65 20 6f 66  ,    --  Name of
10d0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
10e0: 20 20 2a 2a 20 20 20 20 20 20 20 20 74 62 6c 5f    **        tbl_
10f0: 6e 61 6d 65 20 20 20 74 65 78 74 2c 20 20 20 20  name   text,    
1100: 2d 2d 20 20 41 73 73 6f 63 69 61 74 65 64 20 74  --  Associated t
1110: 61 62 6c 65 20 0a 20 20 2a 2a 20 20 20 20 20 20  able .  **      
1120: 20 20 72 6f 6f 74 70 61 67 65 20 20 20 69 6e 74    rootpage   int
1130: 65 67 65 72 2c 20 2d 2d 20 20 54 68 65 20 69 6e  eger, --  The in
1140: 74 65 67 65 72 20 70 61 67 65 20 6e 75 6d 62 65  teger page numbe
1150: 72 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 0a 20  r of root page. 
1160: 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 20 20   **        sql  
1170: 20 20 20 20 20 20 74 65 78 74 20 20 20 20 20 2d        text     -
1180: 2d 20 20 54 68 65 20 43 52 45 41 54 45 20 73 74  -  The CREATE st
1190: 61 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 69 73  atement for this
11a0: 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 20 20 20   object.  **    
11b0: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
11c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
11d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  able contains a 
11e0: 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 6f 72  single entry for
11f0: 20 65 61 63 68 20 74 61 62 6c 65 0a 20 20 2a 2a   each table.  **
1200: 20 61 6e 64 20 65 61 63 68 20 69 6e 64 65 78 2e   and each index.
1210: 20 20 54 68 65 20 22 74 79 70 65 22 20 63 6f 6c    The "type" col
1220: 75 6d 6e 20 74 65 6c 6c 73 20 77 68 65 74 68 65  umn tells whethe
1230: 72 20 74 68 65 20 65 6e 74 72 79 20 69 73 0a 20  r the entry is. 
1240: 20 2a 2a 20 61 20 74 61 62 6c 65 20 6f 72 20 69   ** a table or i
1250: 6e 64 65 78 2e 20 20 54 68 65 20 22 6e 61 6d 65  ndex.  The "name
1260: 22 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  " column is the 
1270: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65  name of the obje
1280: 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 22 74 62  ct..  ** The "tb
1290: 6c 5f 6e 61 6d 65 22 20 69 73 20 74 68 65 20 6e  l_name" is the n
12a0: 61 6d 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  ame of the assoc
12b0: 69 61 74 65 64 20 74 61 62 6c 65 2e 20 20 46 6f  iated table.  Fo
12c0: 72 20 74 61 62 6c 65 73 2c 0a 20 20 2a 2a 20 74  r tables,.  ** t
12d0: 68 65 20 74 62 6c 5f 6e 61 6d 65 20 63 6f 6c 75  he tbl_name colu
12e0: 6d 6e 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  mn is always the
12f0: 20 73 61 6d 65 20 61 73 20 6e 61 6d 65 2e 20 20   same as name.  
1300: 46 6f 72 20 69 6e 64 69 63 65 73 2c 20 74 68 65  For indices, the
1310: 0a 20 20 2a 2a 20 74 62 6c 5f 6e 61 6d 65 20 63  .  ** tbl_name c
1320: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74  olumn contains t
1330: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1340: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 69 6e  able that the in
1350: 64 65 78 0a 20 20 2a 2a 20 69 6e 64 65 78 65 73  dex.  ** indexes
1360: 2e 20 20 54 68 65 20 22 72 6f 6f 74 70 61 67 65  .  The "rootpage
1370: 22 20 63 6f 6c 75 6d 6e 20 68 6f 6c 64 73 20 74  " column holds t
1380: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
1390: 20 72 6f 6f 74 20 70 61 67 65 0a 20 20 2a 2a 20   root page.  ** 
13a0: 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 66  for the b-tree f
13b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  or the table or 
13c0: 69 6e 64 65 78 2e 20 20 46 69 6e 61 6c 6c 79 2c  index.  Finally,
13d0: 20 74 68 65 20 22 73 71 6c 22 20 63 6f 6c 75 6d   the "sql" colum
13e0: 6e 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  n.  ** contains 
13f0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
1400: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
1410: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
1420: 49 4e 44 45 58 0a 20 20 2a 2a 20 73 74 61 74 65  INDEX.  ** state
1430: 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e  ment that origin
1440: 61 6c 6c 79 20 63 72 65 61 74 65 64 20 74 68 65  ally created the
1450: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e   table or index.
1460: 20 20 49 66 20 61 6e 20 69 6e 64 65 78 0a 20 20    If an index.  
1470: 2a 2a 20 77 61 73 20 63 72 65 61 74 65 64 20 74  ** was created t
1480: 6f 20 66 75 6c 66 69 6c 6c 20 61 20 50 52 49 4d  o fulfill a PRIM
1490: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
14a0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  E constraint on 
14b0: 61 20 74 61 62 6c 65 2c 0a 20 20 2a 2a 20 74 68  a table,.  ** th
14c0: 65 6e 20 74 68 65 20 22 73 71 6c 22 20 63 6f 6c  en the "sql" col
14d0: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 2a  umn is NULL..  *
14e0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 22 74  *.  ** If the "t
14f0: 79 70 65 22 20 63 6f 6c 75 6d 6e 20 68 61 73 20  ype" column has 
1500: 74 68 65 20 76 61 6c 75 65 20 22 6d 65 74 61 22  the value "meta"
1510: 2c 20 74 68 65 6e 20 74 68 65 20 22 73 71 6c 22  , then the "sql"
1520: 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 63 6f 6e   column.  ** con
1530: 74 61 69 6e 73 20 65 78 74 72 61 20 69 6e 66 6f  tains extra info
1540: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
1550: 65 20 64 61 74 61 62 61 73 65 2c 20 73 75 63 68  e database, such
1560: 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c   as the.  ** fil
1570: 65 20 66 6f 72 6d 61 74 20 76 65 72 73 69 6f 6e  e format version
1580: 20 6e 75 6d 62 65 72 2e 20 20 41 6c 6c 20 6d 65   number.  All me
1590: 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d  ta information m
15a0: 75 73 74 20 62 65 20 70 72 6f 63 65 73 73 65 64  ust be processed
15b0: 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79  .  ** before any
15c0: 20 74 61 62 6c 65 73 20 6f 72 20 69 6e 64 69 63   tables or indic
15d0: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74  es are construct
15e0: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
15f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 67  e following prog
1600: 72 61 6d 20 69 6e 76 6f 6b 65 73 20 69 74 73 20  ram invokes its 
1610: 63 61 6c 6c 62 61 63 6b 20 6f 6e 20 74 68 65 20  callback on the 
1620: 53 51 4c 20 66 6f 72 20 65 61 63 68 0a 20 20 2a  SQL for each.  *
1630: 2a 20 74 61 62 6c 65 20 74 68 65 6e 20 67 6f 65  * table then goe
1640: 73 20 62 61 63 6b 20 61 6e 64 20 69 6e 76 6f 6b  s back and invok
1650: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
1660: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  on the.  ** SQL 
1670: 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2e 20  for each index. 
1680: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 77 69   The callback wi
1690: 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  ll invoke the.  
16a0: 2a 2a 20 70 61 72 73 65 72 20 74 6f 20 62 75 69  ** parser to bui
16b0: 6c 64 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ld the internal 
16c0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
16d0: 66 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  f the.  ** datab
16e0: 61 73 65 20 73 63 68 65 6d 65 2e 0a 20 20 2a 2f  ase scheme..  */
16f0: 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70  .  static VdbeOp
1700: 20 69 6e 69 74 50 72 6f 67 5b 5d 20 3d 20 7b 0a   initProg[] = {.
1710: 20 20 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20      { OP_Open,  
1720: 20 20 20 20 20 30 2c 20 32 2c 20 20 30 7d 2c 0a       0, 2,  0},.
1730: 20 20 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c      { OP_String,
1740: 20 20 20 20 20 30 2c 20 30 2c 20 20 22 66 69 6c       0, 0,  "fil
1750: 65 2d 66 6f 72 6d 61 74 22 7d 2c 0a 20 20 20 20  e-format"},.    
1760: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
1770: 20 30 2c 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20   0, 0,  0},.    
1780: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
1790: 20 30 2c 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20   0, 0,  0},.    
17a0: 7b 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c  { OP_ReadCookie,
17b0: 20 30 2c 20 31 2c 20 20 30 7d 2c 0a 20 20 20 20   0, 1,  0},.    
17c0: 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20  { OP_Callback,  
17d0: 20 34 2c 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20   4, 0,  0},.    
17e0: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
17f0: 20 30 2c 20 30 2c 20 20 22 73 63 68 65 6d 61 5f   0, 0,  "schema_
1800: 63 6f 6f 6b 69 65 22 7d 2c 0a 20 20 20 20 7b 20  cookie"},.    { 
1810: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30  OP_String,     0
1820: 2c 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20 7b 20  , 0,  0},.    { 
1830: 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20 20 30  OP_String,     0
1840: 2c 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20 7b 20  , 0,  0},.    { 
1850: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 30  OP_ReadCookie, 0
1860: 2c 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20 7b 20  , 0,  0},.    { 
1870: 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c 20 20 20 34  OP_Callback,   4
1880: 2c 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20 7b 20  , 0,  0},.    { 
1890: 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20 20 30  OP_Rewind,     0
18a0: 2c 20 33 31 2c 20 30 7d 2c 0a 20 20 20 20 7b 20  , 31, 0},.    { 
18b0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30  OP_Column,     0
18c0: 2c 20 30 2c 20 20 30 7d 2c 20 20 20 20 20 20 20  , 0,  0},       
18d0: 20 20 20 20 2f 2a 20 31 32 20 2a 2f 0a 20 20 20      /* 12 */.   
18e0: 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20   { OP_String,   
18f0: 20 20 30 2c 20 30 2c 20 20 22 74 61 62 6c 65 22    0, 0,  "table"
1900: 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20  },.    { OP_Ne, 
1910: 20 20 20 20 20 20 20 20 30 2c 20 32 30 2c 20 30          0, 20, 0
1920: 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  },.    { OP_Colu
1930: 6d 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 30  mn,     0, 0,  0
1940: 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  },.    { OP_Colu
1950: 6d 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 30  mn,     0, 1,  0
1960: 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  },.    { OP_Colu
1970: 6d 6e 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 30  mn,     0, 3,  0
1980: 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75  },.    { OP_Colu
1990: 6d 6e 2c 20 20 20 20 20 30 2c 20 34 2c 20 20 30  mn,     0, 4,  0
19a0: 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c  },.    { OP_Call
19b0: 62 61 63 6b 2c 20 20 20 34 2c 20 30 2c 20 20 30  back,   4, 0,  0
19c0: 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74  },.    { OP_Next
19d0: 2c 20 20 20 20 20 20 20 30 2c 20 31 32 2c 20 30  ,       0, 12, 0
19e0: 7d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  },           /* 
19f0: 32 30 20 2a 2f 0a 20 20 20 20 7b 20 4f 50 5f 52  20 */.    { OP_R
1a00: 65 77 69 6e 64 2c 20 20 20 20 20 30 2c 20 33 31  ewind,     0, 31
1a10: 2c 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20  , 0},           
1a20: 2f 2a 20 32 31 20 2a 2f 0a 20 20 20 20 7b 20 4f  /* 21 */.    { O
1a30: 50 5f 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 30 2c  P_Column,     0,
1a40: 20 30 2c 20 20 30 7d 2c 20 20 20 20 20 20 20 20   0,  0},        
1a50: 20 20 20 2f 2a 20 32 32 20 2a 2f 0a 20 20 20 20     /* 22 */.    
1a60: 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20 20 20  { OP_String,    
1a70: 20 30 2c 20 30 2c 20 20 22 69 6e 64 65 78 22 7d   0, 0,  "index"}
1a80: 2c 0a 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20  ,.    { OP_Ne,  
1a90: 20 20 20 20 20 20 20 30 2c 20 33 30 2c 20 30 7d         0, 30, 0}
1aa0: 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d  ,.    { OP_Colum
1ab0: 6e 2c 20 20 20 20 20 30 2c 20 30 2c 20 20 30 7d  n,     0, 0,  0}
1ac0: 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d  ,.    { OP_Colum
1ad0: 6e 2c 20 20 20 20 20 30 2c 20 31 2c 20 20 30 7d  n,     0, 1,  0}
1ae0: 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d  ,.    { OP_Colum
1af0: 6e 2c 20 20 20 20 20 30 2c 20 33 2c 20 20 30 7d  n,     0, 3,  0}
1b00: 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 6f 6c 75 6d  ,.    { OP_Colum
1b10: 6e 2c 20 20 20 20 20 30 2c 20 34 2c 20 20 30 7d  n,     0, 4,  0}
1b20: 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 61 6c 6c 62  ,.    { OP_Callb
1b30: 61 63 6b 2c 20 20 20 34 2c 20 30 2c 20 20 30 7d  ack,   4, 0,  0}
1b40: 2c 0a 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c  ,.    { OP_Next,
1b50: 20 20 20 20 20 20 20 30 2c 20 32 32 2c 20 30 7d         0, 22, 0}
1b60: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33  ,           /* 3
1b70: 30 20 2a 2f 0a 20 20 20 20 7b 20 4f 50 5f 43 6c  0 */.    { OP_Cl
1b80: 6f 73 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20  ose,      0, 0, 
1b90: 20 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 2f   0},           /
1ba0: 2a 20 33 31 20 2a 2f 0a 20 20 20 20 7b 20 4f 50  * 31 */.    { OP
1bb0: 5f 48 61 6c 74 2c 20 20 20 20 20 20 20 30 2c 20  _Halt,       0, 
1bc0: 30 2c 20 20 30 7d 2c 0a 20 20 7d 3b 0a 0a 20 20  0,  0},.  };..  
1bd0: 2f 2a 20 43 72 65 61 74 65 20 61 20 76 69 72 74  /* Create a virt
1be0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 74 6f 20 72  ual machine to r
1bf0: 75 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  un the initializ
1c00: 61 74 69 6f 6e 20 70 72 6f 67 72 61 6d 2e 20 20  ation program.  
1c10: 52 75 6e 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f  Run.  ** the pro
1c20: 67 72 61 6d 2e 20 20 54 68 65 6e 20 64 65 6c 65  gram.  Then dele
1c30: 74 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  te the virtual m
1c40: 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 76  achine..  */.  v
1c50: 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64 62 65  dbe = sqliteVdbe
1c60: 43 72 65 61 74 65 28 64 62 29 3b 0a 20 20 69 66  Create(db);.  if
1c70: 28 20 76 64 62 65 3d 3d 30 20 29 7b 0a 20 20 20  ( vdbe==0 ){.   
1c80: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1c90: 28 70 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74 20  (pzErrMsg, "out 
1ca0: 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a  of memory", 0);.
1cb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cc0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
1cd0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 4c 69  qliteVdbeAddOpLi
1ce0: 73 74 28 76 64 62 65 2c 20 73 69 7a 65 6f 66 28  st(vdbe, sizeof(
1cf0: 69 6e 69 74 50 72 6f 67 29 2f 73 69 7a 65 6f 66  initProg)/sizeof
1d00: 28 69 6e 69 74 50 72 6f 67 5b 30 5d 29 2c 20 69  (initProg[0]), i
1d10: 6e 69 74 50 72 6f 67 29 3b 0a 20 20 72 63 20 3d  nitProg);.  rc =
1d20: 20 73 71 6c 69 74 65 56 64 62 65 45 78 65 63 28   sqliteVdbeExec(
1d30: 76 64 62 65 2c 20 73 71 6c 69 74 65 4f 70 65 6e  vdbe, sqliteOpen
1d40: 43 62 2c 20 64 62 2c 20 70 7a 45 72 72 4d 73 67  Cb, db, pzErrMsg
1d50: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1d60: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 70 42 75           db->pBu
1d70: 73 79 41 72 67 2c 20 64 62 2d 3e 78 42 75 73 79  syArg, db->xBusy
1d80: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 73 71 6c  Callback);.  sql
1d90: 69 74 65 56 64 62 65 44 65 6c 65 74 65 28 76 64  iteVdbeDelete(vd
1da0: 62 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  be);.  if( rc==S
1db0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e  QLITE_OK && db->
1dc0: 6e 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  nTable==0 ){.   
1dd0: 20 64 62 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74   db->file_format
1de0: 20 3d 20 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a   = FILE_FORMAT;.
1df0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1e00: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
1e10: 69 6c 65 5f 66 6f 72 6d 61 74 3e 46 49 4c 45 5f  ile_format>FILE_
1e20: 46 4f 52 4d 41 54 20 29 7b 0a 20 20 20 20 73 71  FORMAT ){.    sq
1e30: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a  liteSetString(pz
1e40: 45 72 72 4d 73 67 2c 20 22 75 6e 73 75 70 70 6f  ErrMsg, "unsuppo
1e50: 72 74 65 64 20 66 69 6c 65 20 66 6f 72 6d 61 74  rted file format
1e60: 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  ", 0);.    rc = 
1e70: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1e80: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1e90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 61 62  TE_OK ){.    Tab
1ea0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 63 68  le *pTab;.    ch
1eb0: 61 72 20 2a 61 7a 41 72 67 5b 36 5d 3b 0a 20 20  ar *azArg[6];.  
1ec0: 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 22 74 61    azArg[0] = "ta
1ed0: 62 6c 65 22 3b 0a 20 20 20 20 61 7a 41 72 67 5b  ble";.    azArg[
1ee0: 31 5d 20 3d 20 4d 41 53 54 45 52 5f 4e 41 4d 45  1] = MASTER_NAME
1ef0: 3b 0a 20 20 20 20 61 7a 41 72 67 5b 32 5d 20 3d  ;.    azArg[2] =
1f00: 20 22 32 22 3b 0a 20 20 20 20 61 7a 41 72 67 5b   "2";.    azArg[
1f10: 33 5d 20 3d 20 6d 61 73 74 65 72 5f 73 63 68 65  3] = master_sche
1f20: 6d 61 3b 0a 20 20 20 20 61 7a 41 72 67 5b 34 5d  ma;.    azArg[4]
1f30: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1f40: 4f 70 65 6e 43 62 28 64 62 2c 20 34 2c 20 61 7a  OpenCb(db, 4, az
1f50: 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 70 54 61  Arg, 0);.    pTa
1f60: 62 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61  b = sqliteFindTa
1f70: 62 6c 65 28 64 62 2c 20 4d 41 53 54 45 52 5f 4e  ble(db, MASTER_N
1f80: 41 4d 45 29 3b 0a 20 20 20 20 69 66 28 20 70 54  AME);.    if( pT
1f90: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
1fa0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
1fb0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
1fc0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
1fd0: 69 74 69 61 6c 69 7a 65 64 3b 0a 20 20 20 20 73  itialized;.    s
1fe0: 71 6c 69 74 65 43 6f 6d 6d 69 74 49 6e 74 65 72  qliteCommitInter
1ff0: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
2000: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 65  .}../*.** The ve
2020: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62  rsion of the lib
2030: 72 61 72 79 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  rary.*/.const ch
2040: 61 72 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f  ar sqlite_versio
2050: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
2060: 53 49 4f 4e 3b 0a 0a 2f 2a 0a 2a 2a 20 44 6f 65  SION;../*.** Doe
2070: 73 20 74 68 65 20 6c 69 62 72 61 72 79 20 65 78  s the library ex
2080: 70 65 63 74 20 64 61 74 61 20 74 6f 20 62 65 20  pect data to be 
2090: 65 6e 63 6f 64 65 64 20 61 73 20 55 54 46 2d 38  encoded as UTF-8
20a0: 20 6f 72 20 69 73 6f 38 38 35 39 3f 20 20 54 68   or iso8859?  Th
20b0: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 67  e.** following g
20c0: 6c 6f 62 61 6c 20 63 6f 6e 73 74 61 6e 74 20 61  lobal constant a
20d0: 6c 77 61 79 73 20 6c 65 74 73 20 75 73 20 6b 6e  lways lets us kn
20e0: 6f 77 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ow..*/.#ifdef SQ
20f0: 4c 49 54 45 5f 55 54 46 38 0a 63 6f 6e 73 74 20  LITE_UTF8.const 
2100: 63 68 61 72 20 73 71 6c 69 74 65 5f 65 6e 63 6f  char sqlite_enco
2110: 64 69 6e 67 5b 5d 20 3d 20 22 55 54 46 2d 38 22  ding[] = "UTF-8"
2120: 3b 0a 23 65 6c 73 65 0a 63 6f 6e 73 74 20 63 68  ;.#else.const ch
2130: 61 72 20 73 71 6c 69 74 65 5f 65 6e 63 6f 64 69  ar sqlite_encodi
2140: 6e 67 5b 5d 20 3d 20 22 69 73 6f 38 38 35 39 22  ng[] = "iso8859"
2150: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
2160: 4f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74  Open a new SQLit
2170: 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 6f 6e  e database.  Con
2180: 73 74 72 75 63 74 20 61 6e 20 22 73 71 6c 69 74  struct an "sqlit
2190: 65 22 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  e" structure to 
21a0: 64 65 66 69 6e 65 0a 2a 2a 20 74 68 65 20 73 74  define.** the st
21b0: 61 74 65 20 6f 66 20 74 68 69 73 20 64 61 74 61  ate of this data
21c0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  base and return 
21d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61  a pointer to tha
21e0: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  t structure..**.
21f0: 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  ** An attempt is
2200: 20 6d 61 64 65 20 74 6f 20 69 6e 69 74 69 61 6c   made to initial
2210: 69 7a 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ize the in-memor
2220: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
2230: 73 20 74 68 61 74 0a 2a 2a 20 68 6f 6c 64 20 74  s that.** hold t
2240: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
2250: 6d 61 2e 20 20 42 75 74 20 69 66 20 74 68 69 73  ma.  But if this
2260: 20 66 61 69 6c 73 20 28 62 65 63 61 75 73 65 20   fails (because 
2270: 74 68 65 20 73 63 68 65 6d 61 20 66 69 6c 65 0a  the schema file.
2280: 2a 2a 20 69 73 20 6c 6f 63 6b 65 64 29 20 74 68  ** is locked) th
2290: 65 6e 20 74 68 61 74 20 73 74 65 70 20 69 73 20  en that step is 
22a0: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
22b0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
22c0: 0a 2a 2a 20 73 71 6c 69 74 65 5f 65 78 65 63 28  .** sqlite_exec(
22d0: 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 20 2a 73 71  )..*/.sqlite *sq
22e0: 6c 69 74 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  lite_open(const 
22f0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2300: 20 69 6e 74 20 6d 6f 64 65 2c 20 63 68 61 72 20   int mode, char 
2310: 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73  **pzErrMsg){.  s
2320: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 69 6e 74  qlite *db;.  int
2330: 20 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   rc;..  /* Alloc
2340: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
2350: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
2360: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 4d 61  .  db = sqliteMa
2370: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 71 6c  lloc( sizeof(sql
2380: 69 74 65 29 20 29 3b 0a 20 20 69 66 28 20 70 7a  ite) );.  if( pz
2390: 45 72 72 4d 73 67 20 29 20 2a 70 7a 45 72 72 4d  ErrMsg ) *pzErrM
23a0: 73 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62  sg = 0;.  if( db
23b0: 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
23c0: 6d 5f 6f 6e 5f 6f 70 65 6e 3b 0a 20 20 73 71 6c  m_on_open;.  sql
23d0: 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d  iteHashInit(&db-
23e0: 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45  >tblHash, SQLITE
23f0: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
2400: 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e  ;.  sqliteHashIn
2410: 69 74 28 26 64 62 2d 3e 69 64 78 48 61 73 68 2c  it(&db->idxHash,
2420: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53 54 52   SQLITE_HASH_STR
2430: 49 4e 47 2c 20 30 29 3b 0a 20 20 64 62 2d 3e 6e  ING, 0);.  db->n
2440: 65 78 74 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  extRowid = sqlit
2450: 65 52 61 6e 64 6f 6d 49 6e 74 65 67 65 72 28 29  eRandomInteger()
2460: 3b 0a 20 20 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  ;.  .  /* Open t
2470: 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62  he backend datab
2480: 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20  ase driver */.  
2490: 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65 65  rc = sqliteBtree
24a0: 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Open(zFilename, 
24b0: 6d 6f 64 65 2c 20 4d 41 58 5f 50 41 47 45 53 2c  mode, MAX_PAGES,
24c0: 20 26 64 62 2d 3e 70 42 65 29 3b 0a 20 20 69 66   &db->pBe);.  if
24d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24e0: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72  ){.    switch( r
24f0: 63 20 29 7b 0a 20 20 20 20 20 20 64 65 66 61 75  c ){.      defau
2500: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  lt: {.        if
2510: 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  ( pzErrMsg ){.  
2520: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
2530: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
2540: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
2550: 6e 20 64 61 74 61 62 61 73 65 3a 20 22 2c 20 7a  n database: ", z
2560: 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
2570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2580: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2590: 46 72 65 65 28 64 62 29 3b 0a 20 20 20 20 73 71  Free(db);.    sq
25a0: 6c 69 74 65 53 74 72 52 65 61 6c 6c 6f 63 28 70  liteStrRealloc(p
25b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
25c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
25d0: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61  * Attempt to rea
25e0: 64 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a  d the schema */.
25f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69    rc = sqliteIni
2600: 74 28 64 62 2c 20 70 7a 45 72 72 4d 73 67 29 3b  t(db, pzErrMsg);
2610: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 5f 6d 61  .  if( sqlite_ma
2620: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
2630: 20 20 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28     sqlite_close(
2640: 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6e 6f  db);.    goto no
2650: 5f 6d 65 6d 5f 6f 6e 5f 6f 70 65 6e 3b 0a 20 20  _mem_on_open;.  
2660: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
2670: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
2680: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
2690: 20 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28 64    sqlite_close(d
26a0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 74  b);.    sqliteSt
26b0: 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73  rRealloc(pzErrMs
26c0: 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  g);.    return 0
26d0: 3b 0a 20 20 7d 65 6c 73 65 20 2f 2a 20 69 66 28  ;.  }else /* if(
26e0: 20 70 7a 45 72 72 4d 73 67 20 29 20 2a 2f 7b 0a   pzErrMsg ) */{.
26f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
2700: 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a  pzErrMsg);.    *
2710: 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  pzErrMsg = 0;.  
2720: 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a 0a  }.  return db;..
2730: 6e 6f 5f 6d 65 6d 5f 6f 6e 5f 6f 70 65 6e 3a 0a  no_mem_on_open:.
2740: 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e    sqliteSetStrin
2750: 67 28 70 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74  g(pzErrMsg, "out
2760: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b   of memory", 0);
2770: 0a 20 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c  .  sqliteStrReal
2780: 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a 20  loc(pzErrMsg);. 
2790: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
27a0: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
27b0: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
27c0: 20 66 72 6f 6d 20 74 68 65 20 73 63 68 65 6d 61   from the schema
27d0: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 45 78   hash table.  Ex
27e0: 63 65 70 74 0a 2a 2a 20 74 61 62 6c 65 73 20 74  cept.** tables t
27f0: 68 61 74 20 61 72 65 20 63 72 65 61 74 65 64 20  hat are created 
2800: 75 73 69 6e 67 20 43 52 45 41 54 45 20 54 45 4d  using CREATE TEM
2810: 50 4f 52 41 52 59 20 54 41 42 4c 45 20 61 72 65  PORARY TABLE are
2820: 20 70 72 65 73 65 72 76 65 64 0a 2a 2a 20 69 66   preserved.** if
2830: 20 74 68 65 20 70 72 65 73 65 72 76 65 72 54 65   the preserverTe
2840: 6d 70 73 20 66 6c 61 67 20 69 73 20 74 72 75 65  mps flag is true
2850: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
2860: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 6e  base schema is n
2870: 6f 72 6d 61 6c 6c 79 20 72 65 61 64 20 69 6e 20  ormally read in 
2880: 6f 6e 63 65 20 77 68 65 6e 20 74 68 65 20 64 61  once when the da
2890: 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 66 69 72  tabase.** is fir
28a0: 73 74 20 6f 70 65 6e 65 64 20 61 6e 64 20 73 74  st opened and st
28b0: 6f 72 65 64 20 69 6e 20 61 20 68 61 73 68 20 74  ored in a hash t
28c0: 61 62 6c 65 20 69 6e 20 74 68 65 20 73 71 6c 69  able in the sqli
28d0: 74 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  te structure..**
28e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 72   This routine er
28f0: 61 73 65 73 20 74 68 65 20 73 74 6f 72 65 64 20  ases the stored 
2900: 73 63 68 65 6d 61 2e 20 20 54 68 69 73 20 65 72  schema.  This er
2910: 61 73 75 72 65 20 6f 63 63 75 72 73 20 62 65 63  asure occurs bec
2920: 61 75 73 65 0a 2a 2a 20 65 69 74 68 65 72 20 74  ause.** either t
2930: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 62  he database is b
2940: 65 69 6e 67 20 63 6c 6f 73 65 64 20 6f 72 20 62  eing closed or b
2950: 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
2960: 72 20 70 72 6f 63 65 73 73 0a 2a 2a 20 63 68 61  r process.** cha
2970: 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 20  nged the schema 
2980: 61 6e 64 20 74 68 69 73 20 70 72 6f 63 65 73 73  and this process
2990: 20 6e 65 65 64 73 20 74 6f 20 72 65 72 65 61 64   needs to reread
29a0: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
29b0: 6f 69 64 20 63 6c 65 61 72 48 61 73 68 54 61 62  oid clearHashTab
29c0: 6c 65 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69  le(sqlite *db, i
29d0: 6e 74 20 70 72 65 73 65 72 76 65 54 65 6d 70 73  nt preserveTemps
29e0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
29f0: 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 74 65 6d  Elem;.  Hash tem
2a00: 70 31 3b 0a 20 20 74 65 6d 70 31 20 3d 20 64 62  p1;.  temp1 = db
2a10: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 73 71 6c  ->tblHash;.  sql
2a20: 69 74 65 48 61 73 68 49 6e 69 74 28 26 64 62 2d  iteHashInit(&db-
2a30: 3e 74 62 6c 48 61 73 68 2c 20 53 51 4c 49 54 45  >tblHash, SQLITE
2a40: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
2a50: 3b 0a 20 20 73 71 6c 69 74 65 48 61 73 68 43 6c  ;.  sqliteHashCl
2a60: 65 61 72 28 26 64 62 2d 3e 69 64 78 48 61 73 68  ear(&db->idxHash
2a70: 29 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  );.  for(pElem=s
2a80: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
2a90: 74 65 6d 70 31 29 3b 20 70 45 6c 65 6d 3b 20 70  temp1); pElem; p
2aa0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
2ab0: 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
2ac0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
2ad0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
2ae0: 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 72  lem);.    if( pr
2af0: 65 73 65 72 76 65 54 65 6d 70 73 20 26 26 20 70  eserveTemps && p
2b00: 54 61 62 2d 3e 69 73 54 65 6d 70 20 29 7b 0a 20  Tab->isTemp ){. 
2b10: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
2b20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d  ;.      int nNam
2b30: 65 20 3d 20 73 74 72 6c 65 6e 28 70 54 61 62 2d  e = strlen(pTab-
2b40: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 54  >zName);.      T
2b50: 61 62 6c 65 20 2a 70 4f 6c 64 20 3d 20 73 71 6c  able *pOld = sql
2b60: 69 74 65 48 61 73 68 49 6e 73 65 72 74 28 26 64  iteHashInsert(&d
2b70: 62 2d 3e 74 62 6c 48 61 73 68 2c 20 70 54 61 62  b->tblHash, pTab
2b80: 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  ->zName, nName+1
2b90: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , pTab);.      i
2ba0: 66 28 20 70 4f 6c 64 21 3d 30 20 29 7b 0a 20 20  f( pOld!=0 ){.  
2bb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
2bc0: 6c 64 3d 3d 70 54 61 62 20 29 3b 20 20 20 2f 2a  ld==pTab );   /*
2bd0: 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 6f   Malloc failed o
2be0: 6e 20 74 68 65 20 48 61 73 68 49 6e 73 65 72 74  n the HashInsert
2bf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
2c00: 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  teDeleteTable(db
2c10: 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20  , pOld);.       
2c20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2c30: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64   }.      for(pId
2c40: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
2c50: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
2c60: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
2c70: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
2c80: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2b 31 3b 0a  pIdx->zName)+1;.
2c90: 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2ca0: 4f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20  OldIdx;.        
2cb0: 70 4f 6c 64 49 64 78 20 3d 20 73 71 6c 69 74 65  pOldIdx = sqlite
2cc0: 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
2cd0: 69 64 78 48 61 73 68 2c 20 70 49 64 78 2d 3e 7a  idxHash, pIdx->z
2ce0: 4e 61 6d 65 2c 20 6e 2c 20 70 49 64 78 29 3b 0a  Name, n, pIdx);.
2cf0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
2d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
2d10: 73 65 72 74 28 20 70 4f 6c 64 49 64 78 3d 3d 70  sert( pOldIdx==p
2d20: 49 64 78 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Idx );.         
2d30: 20 73 71 6c 69 74 65 55 6e 6c 69 6e 6b 41 6e 64   sqliteUnlinkAnd
2d40: 44 65 6c 65 74 65 49 6e 64 65 78 28 64 62 2c 20  DeleteIndex(db, 
2d50: 70 4f 6c 64 49 64 78 29 3b 0a 20 20 20 20 20 20  pOldIdx);.      
2d60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2d80: 69 74 65 44 65 6c 65 74 65 54 61 62 6c 65 28 64  iteDeleteTable(d
2d90: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  b, pTab);.    }.
2da0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 48 61 73 68    }.  sqliteHash
2db0: 43 6c 65 61 72 28 26 74 65 6d 70 31 29 3b 0a 20  Clear(&temp1);. 
2dc0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
2dd0: 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65  QLITE_Initialize
2de0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  d;.}../*.** Clos
2df0: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51  e an existing SQ
2e00: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f  Lite database.*/
2e10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 63 6c 6f  .void sqlite_clo
2e20: 73 65 28 73 71 6c 69 74 65 20 2a 64 62 29 7b 0a  se(sqlite *db){.
2e30: 20 20 73 71 6c 69 74 65 42 74 72 65 65 43 6c 6f    sqliteBtreeClo
2e40: 73 65 28 64 62 2d 3e 70 42 65 29 3b 0a 20 20 63  se(db->pBe);.  c
2e50: 6c 65 61 72 48 61 73 68 54 61 62 6c 65 28 64 62  learHashTable(db
2e60: 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
2e70: 70 42 65 54 65 6d 70 20 29 7b 0a 20 20 20 20 73  pBeTemp ){.    s
2e80: 71 6c 69 74 65 42 74 72 65 65 43 6c 6f 73 65 28  qliteBtreeClose(
2e90: 64 62 2d 3e 70 42 65 54 65 6d 70 29 3b 0a 20 20  db->pBeTemp);.  
2ea0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 64  }.  sqliteFree(d
2eb0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  b);.}../*.** Ret
2ec0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2ed0: 67 69 76 65 6e 20 53 51 4c 20 73 74 72 69 6e 67  given SQL string
2ee0: 20 65 6e 64 73 20 69 6e 20 61 20 73 65 6d 69 63   ends in a semic
2ef0: 6f 6c 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  olon..*/.int sql
2f00: 69 74 65 5f 63 6f 6d 70 6c 65 74 65 28 63 6f 6e  ite_complete(con
2f10: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
2f20: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
2f30: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = 0;.  while( *
2f40: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 73 77 69 74  zSql ){.    swit
2f50: 63 68 28 20 2a 7a 53 71 6c 20 29 7b 0a 20 20 20  ch( *zSql ){.   
2f60: 20 20 20 63 61 73 65 20 27 3b 27 3a 20 7b 0a 20     case ';': {. 
2f70: 20 20 20 20 20 20 20 69 73 43 6f 6d 70 6c 65 74         isComplet
2f80: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  e = 1;.        b
2f90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2fa0: 20 20 20 20 63 61 73 65 20 27 20 27 3a 0a 20 20      case ' ':.  
2fb0: 20 20 20 20 63 61 73 65 20 27 5c 74 27 3a 0a 20      case '\t':. 
2fc0: 20 20 20 20 20 63 61 73 65 20 27 5c 6e 27 3a 0a       case '\n':.
2fd0: 20 20 20 20 20 20 63 61 73 65 20 27 5c 66 27 3a        case '\f':
2fe0: 20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   {.        break
2ff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3000: 63 61 73 65 20 27 5c 27 27 3a 20 7b 0a 20 20 20  case '\'': {.   
3010: 20 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20       isComplete 
3020: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 53 71  = 0;.        zSq
3030: 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77 68 69  l++;.        whi
3040: 6c 65 28 20 2a 7a 53 71 6c 20 26 26 20 2a 7a 53  le( *zSql && *zS
3050: 71 6c 21 3d 27 5c 27 27 20 29 7b 20 7a 53 71 6c  ql!='\'' ){ zSql
3060: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ++; }.        if
3070: 28 20 2a 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  ( *zSql==0 ) ret
3080: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 62  urn 0;.        b
3090: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
30a0: 20 20 20 20 63 61 73 65 20 27 22 27 3a 20 7b 0a      case '"': {.
30b0: 20 20 20 20 20 20 20 20 69 73 43 6f 6d 70 6c 65          isComple
30c0: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
30d0: 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zSql++;.        
30e0: 77 68 69 6c 65 28 20 2a 7a 53 71 6c 20 26 26 20  while( *zSql && 
30f0: 2a 7a 53 71 6c 21 3d 27 22 27 20 29 7b 20 7a 53  *zSql!='"' ){ zS
3100: 71 6c 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20  ql++; }.        
3110: 69 66 28 20 2a 7a 53 71 6c 3d 3d 30 20 29 20 72  if( *zSql==0 ) r
3120: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
3130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3140: 20 20 20 20 20 20 63 61 73 65 20 27 2d 27 3a 20        case '-': 
3150: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  {.        if( zS
3160: 71 6c 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20  ql[1]!='-' ){.  
3170: 20 20 20 20 20 20 20 20 69 73 43 6f 6d 70 6c 65          isComple
3180: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
3190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
31a0: 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65   }.        while
31b0: 28 20 2a 7a 53 71 6c 20 26 26 20 2a 7a 53 71 6c  ( *zSql && *zSql
31c0: 21 3d 27 5c 6e 27 20 29 7b 20 7a 53 71 6c 2b 2b  !='\n' ){ zSql++
31d0: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
31e0: 2a 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72  *zSql==0 ) retur
31f0: 6e 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20 20  n isComplete;.  
3200: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3210: 20 20 20 7d 20 0a 20 20 20 20 20 20 64 65 66 61     } .      defa
3220: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ult: {.        i
3230: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 0a 20  sComplete = 0;. 
3240: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3250: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3260: 7a 53 71 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  zSql++;.  }.  re
3270: 74 75 72 6e 20 69 73 43 6f 6d 70 6c 65 74 65 3b  turn isComplete;
3280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
3290: 65 20 53 51 4c 20 63 6f 64 65 2e 20 20 52 65 74  e SQL code.  Ret
32a0: 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 53  urn one of the S
32b0: 51 4c 49 54 45 5f 20 73 75 63 63 65 73 73 2f 66  QLITE_ success/f
32c0: 61 69 6c 75 72 65 0a 2a 2a 20 63 6f 64 65 73 2e  ailure.** codes.
32d0: 20 20 41 6c 73 6f 20 77 72 69 74 65 20 61 6e 20    Also write an 
32e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
32f0: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
3300: 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f  ed from.** mallo
3310: 63 28 29 20 61 6e 64 20 6d 61 6b 65 20 2a 70 7a  c() and make *pz
3320: 45 72 72 4d 73 67 20 70 6f 69 6e 74 20 74 6f 20  ErrMsg point to 
3330: 74 68 61 74 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  that message..**
3340: 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 20 69  .** If the SQL i
3350: 73 20 61 20 71 75 65 72 79 2c 20 74 68 65 6e 20  s a query, then 
3360: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20  for each row in 
3370: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
3380: 0a 2a 2a 20 74 68 65 20 78 43 61 6c 6c 62 61 63  .** the xCallbac
3390: 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  k() function is 
33a0: 63 61 6c 6c 65 64 2e 20 20 70 41 72 67 20 62 65  called.  pArg be
33b0: 63 6f 6d 65 73 20 74 68 65 20 66 69 72 73 74 0a  comes the first.
33c0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  ** argument to x
33d0: 43 61 6c 6c 62 61 63 6b 28 29 2e 20 20 49 66 20  Callback().  If 
33e0: 78 43 61 6c 6c 62 61 63 6b 3d 4e 55 4c 4c 20 74  xCallback=NULL t
33f0: 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 0a  hen no callback.
3400: 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 65  ** is invoked, e
3410: 76 65 6e 20 66 6f 72 20 71 75 65 72 69 65 73 2e  ven for queries.
3420: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 65  .*/.int sqlite_e
3430: 78 65 63 28 0a 20 20 73 71 6c 69 74 65 20 2a 64  xec(.  sqlite *d
3440: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
3450: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3460: 73 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65 20  se on which the 
3470: 53 51 4c 20 65 78 65 63 75 74 65 73 20 2a 2f 0a  SQL executes */.
3480: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
3490: 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ql,           /*
34a0: 20 54 68 65 20 53 51 4c 20 74 6f 20 62 65 20 65   The SQL to be e
34b0: 78 65 63 75 74 65 64 20 2a 2f 0a 20 20 73 71 6c  xecuted */.  sql
34c0: 69 74 65 5f 63 61 6c 6c 62 61 63 6b 20 78 43 61  ite_callback xCa
34d0: 6c 6c 62 61 63 6b 2c 20 20 2f 2a 20 49 6e 76 6f  llback,  /* Invo
34e0: 6b 65 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b  ke this callback
34f0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 76 6f   routine */.  vo
3500: 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  id *pArg,       
3510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3520: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
3530: 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 20 20  Callback() */.  
3540: 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
3550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
3560: 72 69 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  rite error messa
3570: 67 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ges here */.){. 
3580: 20 50 61 72 73 65 20 73 50 61 72 73 65 3b 0a 0a   Parse sParse;..
3590: 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
35a0: 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a   *pzErrMsg = 0;.
35b0: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
35c0: 20 26 20 53 51 4c 49 54 45 5f 49 6e 69 74 69 61   & SQLITE_Initia
35d0: 6c 69 7a 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20  lized)==0 ){.   
35e0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
35f0: 49 6e 69 74 28 64 62 2c 20 70 7a 45 72 72 4d 73  Init(db, pzErrMs
3600: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
3610: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3620: 20 20 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c     sqliteStrReal
3630: 6c 6f 63 28 70 7a 45 72 72 4d 73 67 29 3b 0a 20  loc(pzErrMsg);. 
3640: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
3650: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73      }.  }.  mems
3660: 65 74 28 26 73 50 61 72 73 65 2c 20 30 2c 20 73  et(&sParse, 0, s
3670: 69 7a 65 6f 66 28 73 50 61 72 73 65 29 29 3b 0a  izeof(sParse));.
3680: 20 20 73 50 61 72 73 65 2e 64 62 20 3d 20 64 62    sParse.db = db
3690: 3b 0a 20 20 73 50 61 72 73 65 2e 70 42 65 20 3d  ;.  sParse.pBe =
36a0: 20 64 62 2d 3e 70 42 65 3b 0a 20 20 73 50 61 72   db->pBe;.  sPar
36b0: 73 65 2e 78 43 61 6c 6c 62 61 63 6b 20 3d 20 78  se.xCallback = x
36c0: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 73 50 61 72  Callback;.  sPar
36d0: 73 65 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  se.pArg = pArg;.
36e0: 20 20 73 71 6c 69 74 65 52 75 6e 50 61 72 73 65    sqliteRunParse
36f0: 72 28 26 73 50 61 72 73 65 2c 20 7a 53 71 6c 2c  r(&sParse, zSql,
3700: 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   pzErrMsg);.  if
3710: 28 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  ( sqlite_malloc_
3720: 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  failed ){.    sq
3730: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a  liteSetString(pz
3740: 45 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f 66 20  ErrMsg, "out of 
3750: 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a 20 20 20  memory", 0);.   
3760: 20 73 50 61 72 73 65 2e 72 63 20 3d 20 53 51 4c   sParse.rc = SQL
3770: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73  ITE_NOMEM;.    s
3780: 71 6c 69 74 65 42 74 72 65 65 52 6f 6c 6c 62 61  qliteBtreeRollba
3790: 63 6b 28 64 62 2d 3e 70 42 65 29 3b 0a 20 20 20  ck(db->pBe);.   
37a0: 20 69 66 28 20 64 62 2d 3e 70 42 65 54 65 6d 70   if( db->pBeTemp
37b0: 20 29 20 73 71 6c 69 74 65 42 74 72 65 65 52 6f   ) sqliteBtreeRo
37c0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 42 65 54 65  llback(db->pBeTe
37d0: 6d 70 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  mp);.    db->fla
37e0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
37f0: 54 72 61 6e 73 3b 0a 20 20 20 20 63 6c 65 61 72  Trans;.    clear
3800: 48 61 73 68 54 61 62 6c 65 28 64 62 2c 20 30 29  HashTable(db, 0)
3810: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 53 74  ;.  }.  sqliteSt
3820: 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73  rRealloc(pzErrMs
3830: 67 29 3b 0a 20 20 69 66 28 20 73 50 61 72 73 65  g);.  if( sParse
3840: 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45  .rc==SQLITE_SCHE
3850: 4d 41 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  MA ){.    clearH
3860: 61 73 68 54 61 62 6c 65 28 64 62 2c 20 31 29 3b  ashTable(db, 1);
3870: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 50  .  }.  return sP
3880: 61 72 73 65 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  arse.rc;.}../*.*
3890: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
38a0: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79  mplements a busy
38b0: 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73   callback that s
38c0: 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a  leeps and tries.
38d0: 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61  ** again until a
38e0: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
38f0: 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20  s reached.  The 
3900: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
3910: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e  .** an integer n
3920: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
3930: 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20  conds passed in 
3940: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
3950: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
3960: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65  tic int sqliteDe
3970: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
3980: 6b 28 0a 20 76 6f 69 64 20 2a 54 69 6d 65 6f 75  k(. void *Timeou
3990: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
39a0: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
39b0: 66 20 74 69 6d 65 20 74 6f 20 77 61 69 74 20 2a  f time to wait *
39c0: 2f 0a 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 4e  /. const char *N
39d0: 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 54  otUsed,     /* T
39e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
39f0: 61 62 6c 65 20 74 68 61 74 20 69 73 20 62 75 73  able that is bus
3a00: 79 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20  y */. int count 
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
3a30: 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e  s table has been
3a40: 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20   busy */.){.#if 
3a50: 53 51 4c 49 54 45 5f 4d 49 4e 5f 53 4c 45 45 50  SQLITE_MIN_SLEEP
3a60: 5f 4d 53 3d 3d 31 0a 20 20 69 6e 74 20 64 65 6c  _MS==1.  int del
3a70: 61 79 20 3d 20 31 30 3b 0a 20 20 69 6e 74 20 70  ay = 10;.  int p
3a80: 72 69 6f 72 5f 64 65 6c 61 79 20 3d 20 30 3b 0a  rior_delay = 0;.
3a90: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20    int timeout = 
3aa0: 28 69 6e 74 29 54 69 6d 65 6f 75 74 3b 0a 20 20  (int)Timeout;.  
3ab0: 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d  int i;..  for(i=
3ac0: 31 3b 20 69 3c 63 6f 75 6e 74 3b 20 69 2b 2b 29  1; i<count; i++)
3ad0: 7b 20 0a 20 20 20 20 70 72 69 6f 72 5f 64 65 6c  { .    prior_del
3ae0: 61 79 20 2b 3d 20 64 65 6c 61 79 3b 0a 20 20 20  ay += delay;.   
3af0: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 2a 32   delay = delay*2
3b00: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3e  ;.    if( delay>
3b10: 3d 31 30 30 30 20 29 7b 0a 20 20 20 20 20 20 64  =1000 ){.      d
3b20: 65 6c 61 79 20 3d 20 31 30 30 30 3b 0a 20 20 20  elay = 1000;.   
3b30: 20 20 20 70 72 69 6f 72 5f 64 65 6c 61 79 20 2b     prior_delay +
3b40: 3d 20 31 30 30 30 2a 28 63 6f 75 6e 74 20 2d 20  = 1000*(count - 
3b50: 69 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 62 72  i - 1);.      br
3b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
3b70: 20 69 66 28 20 70 72 69 6f 72 5f 64 65 6c 61 79   if( prior_delay
3b80: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
3b90: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
3ba0: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
3bb0: 72 5f 64 65 6c 61 79 3b 0a 20 20 20 20 69 66 28  r_delay;.    if(
3bc0: 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75   delay<=0 ) retu
3bd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
3be0: 74 65 4f 73 53 6c 65 65 70 28 64 65 6c 61 79 29  teOsSleep(delay)
3bf0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
3c00: 6c 73 65 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  lse.  int timeou
3c10: 74 20 3d 20 28 69 6e 74 29 54 69 6d 65 6f 75 74  t = (int)Timeout
3c20: 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31  ;.  if( (count+1
3c30: 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74  )*1000 > timeout
3c40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3c50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73  ;.  }.  sqliteOs
3c60: 53 6c 65 65 70 28 31 30 30 30 29 3b 0a 20 20 72  Sleep(1000);.  r
3c70: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
3c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
3c90: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62  utine sets the b
3ca0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  usy callback for
3cb0: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
3cc0: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
3cd0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
3ce0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
3cf0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  iven argument..*
3d00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 5f 62 75  /.void sqlite_bu
3d10: 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  sy_handler(.  sq
3d20: 6c 69 74 65 20 2a 64 62 2c 0a 20 20 69 6e 74 20  lite *db,.  int 
3d30: 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 63  (*xBusy)(void*,c
3d40: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 2c  onst char*,int),
3d50: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
3d60: 0a 20 20 64 62 2d 3e 78 42 75 73 79 43 61 6c 6c  .  db->xBusyCall
3d70: 62 61 63 6b 20 3d 20 78 42 75 73 79 3b 0a 20 20  back = xBusy;.  
3d80: 64 62 2d 3e 70 42 75 73 79 41 72 67 20 3d 20 70  db->pBusyArg = p
3d90: 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
3da0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61  is routine insta
3db0: 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75  lls a default bu
3dc0: 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20  sy handler that 
3dd0: 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a  waits for the.**
3de0: 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65   specified numbe
3df0: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
3e00: 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
3e10: 6e 67 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ng 0..*/.void sq
3e20: 6c 69 74 65 5f 62 75 73 79 5f 74 69 6d 65 6f 75  lite_busy_timeou
3e30: 74 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 69 6e  t(sqlite *db, in
3e40: 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e  t ms){.  if( ms>
3e50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f  0 ){.    sqlite_
3e60: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
3e70: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
3e80: 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  syCallback, (voi
3e90: 64 2a 29 6d 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  d*)ms);.  }else{
3ea0: 0a 20 20 20 20 73 71 6c 69 74 65 5f 62 75 73 79  .    sqlite_busy
3eb0: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20  _handler(db, 0, 
3ec0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
3ed0: 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69   Cause any pendi
3ee0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ng operation to 
3ef0: 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c  stop at its earl
3f00: 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79  iest opportunity
3f10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3f20: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
3f30: 65 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  e *db){.  db->fl
3f40: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3f50: 74 65 72 72 75 70 74 3b 0a 7d 0a                 terrupt;.}.