/ Hex Artifact Content
Login

Artifact e3297835b8e38ca726ac73f2c2bdb7cf08103197:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 4d 61 69 6e 20 66 69 6c 65 20 66  *.** Main file f
03b0: 6f 72 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  or the SQLite li
03c0: 62 72 61 72 79 2e 20 20 54 68 65 20 72 6f 75 74  brary.  The rout
03d0: 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
03e0: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e.** implement t
03f0: 68 65 20 70 72 6f 67 72 61 6d 6d 65 72 20 69 6e  he programmer in
0400: 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 6c  terface to the l
0410: 69 62 72 61 72 79 2e 20 20 52 6f 75 74 69 6e 65  ibrary.  Routine
0420: 73 20 69 6e 0a 2a 2a 20 6f 74 68 65 72 20 66 69  s in.** other fi
0430: 6c 65 73 20 61 72 65 20 66 6f 72 20 69 6e 74 65  les are for inte
0440: 72 6e 61 6c 20 75 73 65 20 62 79 20 53 51 4c 69  rnal use by SQLi
0450: 74 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e 6f  te and should no
0460: 74 20 62 65 0a 2a 2a 20 61 63 63 65 73 73 65 64  t be.** accessed
0470: 20 62 79 20 75 73 65 72 73 20 6f 66 20 74 68 65   by users of the
0480: 20 6c 69 62 72 61 72 79 2e 0a 2a 2a 0a 2a 2a 20   library..**.** 
0490: 24 49 64 3a 20 6d 61 69 6e 2e 63 2c 76 20 31 2e  $Id: main.c,v 1.
04a0: 31 32 20 32 30 30 30 2f 30 36 2f 30 37 20 32 33  12 2000/06/07 23
04b0: 3a 35 31 3a 35 30 20 64 72 68 20 45 78 70 20 24  :51:50 drh Exp $
04c0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
04d0: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  liteInt.h"../*.*
04e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
04f0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
0500: 6f 72 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  or the code that
0510: 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
0520: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 45  .** database.  E
0530: 61 63 68 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6e  ach callback con
0540: 74 61 69 6e 73 20 74 65 78 74 20 6f 66 20 61 20  tains text of a 
0550: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 0a  CREATE TABLE or.
0560: 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ** CREATE INDEX 
0570: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6d  statement that m
0580: 75 73 74 20 62 65 20 70 61 72 73 65 64 20 74 6f  ust be parsed to
0590: 20 79 69 65 6c 64 20 74 68 65 20 69 6e 74 65 72   yield the inter
05a0: 6e 61 6c 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nal.** structure
05b0: 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20  s that describe 
05c0: 74 68 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73  the tables..*/.s
05d0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
05e0: 4f 70 65 6e 43 62 28 76 6f 69 64 20 2a 70 44 62  OpenCb(void *pDb
05f0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
0600: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
0610: 61 7a 43 6f 6c 4e 61 6d 65 29 7b 0a 20 20 73 71  azColName){.  sq
0620: 6c 69 74 65 20 2a 64 62 20 3d 20 28 73 71 6c 69  lite *db = (sqli
0630: 74 65 2a 29 70 44 62 3b 0a 20 20 50 61 72 73 65  te*)pDb;.  Parse
0640: 20 73 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6e   sParse;.  int n
0650: 45 72 72 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  Err;..  if( argc
0660: 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=1 ) return 0;.
0670: 20 20 6d 65 6d 73 65 74 28 26 73 50 61 72 73 65    memset(&sParse
0680: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 50 61 72  , 0, sizeof(sPar
0690: 73 65 29 29 3b 0a 20 20 73 50 61 72 73 65 2e 64  se));.  sParse.d
06a0: 62 20 3d 20 64 62 3b 0a 20 20 73 50 61 72 73 65  b = db;.  sParse
06b0: 2e 69 6e 69 74 46 6c 61 67 20 3d 20 31 3b 0a 20  .initFlag = 1;. 
06c0: 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 52 75   nErr = sqliteRu
06d0: 6e 50 61 72 73 65 72 28 26 73 50 61 72 73 65 2c  nParser(&sParse,
06e0: 20 61 72 67 76 5b 30 5d 2c 20 30 29 3b 0a 20 20   argv[0], 0);.  
06f0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a  return nErr;.}..
0700: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
0710: 20 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61   read the databa
0720: 73 65 20 73 63 68 65 6d 61 20 61 6e 64 20 69 6e  se schema and in
0730: 69 74 69 61 6c 69 7a 65 20 69 6e 74 65 72 6e 61  itialize interna
0740: 6c 0a 2a 2a 20 64 61 74 61 20 73 74 72 75 63 74  l.** data struct
0750: 75 72 65 73 2e 20 20 52 65 74 75 72 6e 20 6f 6e  ures.  Return on
0760: 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
0770: 20 65 72 72 6f 72 20 63 6f 64 65 73 20 74 6f 0a   error codes to.
0780: 2a 2a 20 69 6e 64 69 63 61 74 65 20 73 75 63 63  ** indicate succ
0790: 65 73 73 20 6f 72 20 66 61 69 6c 75 72 65 2e 0a  ess or failure..
07a0: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
07b0: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 69 74  database is init
07c0: 69 61 6c 69 7a 65 64 2c 20 74 68 65 20 53 51 4c  ialized, the SQL
07d0: 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a 65 64 0a  ITE_Initialized.
07e0: 2a 2a 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ** bit is set in
07f0: 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
0800: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20 73   of the sqlite s
0810: 74 72 75 63 74 75 72 65 2e 20 20 41 6e 0a 2a 2a  tructure.  An.**
0820: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
0830: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
0840: 68 65 20 64 61 74 61 62 61 73 65 20 61 73 20 73  he database as s
0850: 6f 6f 6e 20 61 73 20 69 74 0a 2a 2a 20 69 73 20  oon as it.** is 
0860: 6f 70 65 6e 65 64 2e 20 20 49 66 20 74 68 61 74  opened.  If that
0870: 20 66 61 69 6c 73 20 28 70 65 72 68 61 70 73 20   fails (perhaps 
0880: 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 20  because another 
0890: 70 72 6f 63 65 73 73 0a 2a 2a 20 68 61 73 20 74  process.** has t
08a0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
08b0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 29 20 74   table locked) t
08c0: 68 61 6e 20 61 6e 6f 74 68 65 72 20 61 74 74 65  han another atte
08d0: 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
08e0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
08f0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 63  e database is ac
0900: 63 65 73 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  cessed..*/.stati
0910: 63 20 69 6e 74 20 73 71 6c 69 74 65 49 6e 69 74  c int sqliteInit
0920: 28 73 71 6c 69 74 65 20 2a 64 62 2c 20 63 68 61  (sqlite *db, cha
0930: 72 20 2a 2a 70 7a 45 72 72 4d 73 67 29 7b 0a 20  r **pzErrMsg){. 
0940: 20 56 64 62 65 20 2a 76 64 62 65 3b 0a 20 20 69   Vdbe *vdbe;.  i
0950: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  nt rc;..  /*.  *
0960: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 64 61 74  * The master dat
0970: 61 62 61 73 65 20 74 61 62 6c 65 20 68 61 73 20  abase table has 
0980: 61 20 73 74 72 75 63 74 75 72 65 20 6c 69 6b 65  a structure like
0990: 20 74 68 69 73 0a 20 20 2a 2f 0a 20 20 73 74 61   this.  */.  sta
09a0: 74 69 63 20 63 68 61 72 20 6d 61 73 74 65 72 5f  tic char master_
09b0: 73 63 68 65 6d 61 5b 5d 20 3d 20 0a 20 20 20 20  schema[] = .    
09c0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
09d0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 20 22 20 28   MASTER_NAME " (
09e0: 5c 6e 22 0a 20 20 20 20 20 22 20 20 74 79 70 65  \n".     "  type
09f0: 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 22   text,\n".     "
0a00: 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a    name text,\n".
0a10: 20 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65       "  tbl_name
0a20: 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 22   text,\n".     "
0a30: 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20    sql text\n".  
0a40: 20 20 20 22 29 22 0a 20 20 3b 0a 0a 20 20 2f 2a     ")".  ;..  /*
0a50: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
0a60: 72 6f 67 72 61 6d 20 69 73 20 75 73 65 64 20 74  rogram is used t
0a70: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0a80: 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 73   internal.  ** s
0a90: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 69 6e 67  tructure holding
0aa0: 20 74 68 65 20 74 61 62 6c 65 73 20 61 6e 64 20   the tables and 
0ab0: 69 6e 64 65 78 65 73 20 6f 66 20 74 68 65 20 64  indexes of the d
0ac0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 54 68  atabase..  ** Th
0ad0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
0ae0: 69 6e 73 20 61 20 73 70 65 63 69 61 6c 20 74 61  ins a special ta
0af0: 62 6c 65 20 6e 61 6d 65 64 20 22 73 71 6c 69 74  ble named "sqlit
0b00: 65 5f 6d 61 73 74 65 72 22 0a 20 20 2a 2a 20 64  e_master".  ** d
0b10: 65 66 69 6e 65 64 20 61 73 20 66 6f 6c 6c 6f 77  efined as follow
0b20: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
0b30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c  CREATE TABLE sql
0b40: 69 74 65 5f 6d 61 73 74 65 72 20 28 0a 20 20 2a  ite_master (.  *
0b50: 2a 20 20 20 20 20 20 20 20 74 79 70 65 20 20 20  *        type   
0b60: 20 20 20 20 74 65 78 74 2c 20 20 20 20 2d 2d 20      text,    -- 
0b70: 20 45 69 74 68 65 72 20 22 74 61 62 6c 65 22 20   Either "table" 
0b80: 6f 72 20 22 69 6e 64 65 78 22 0a 20 20 2a 2a 20  or "index".  ** 
0b90: 20 20 20 20 20 20 20 6e 61 6d 65 20 20 20 20 20         name     
0ba0: 20 20 74 65 78 74 2c 20 20 20 20 2d 2d 20 20 4e    text,    --  N
0bb0: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20  ame of table or 
0bc0: 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 20 20 20  index.  **      
0bd0: 20 20 74 62 6c 5f 6e 61 6d 65 20 20 20 74 65 78    tbl_name   tex
0be0: 74 2c 20 20 20 20 2d 2d 20 20 41 73 73 6f 63 69  t,    --  Associ
0bf0: 61 74 65 64 20 74 61 62 6c 65 20 0a 20 20 2a 2a  ated table .  **
0c00: 20 20 20 20 20 20 20 20 73 71 6c 20 20 20 20 20          sql     
0c10: 20 20 20 74 65 78 74 20 20 20 20 20 2d 2d 20 20     text     --  
0c20: 54 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  The CREATE state
0c30: 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20 6f 62  ment for this ob
0c40: 6a 65 63 74 0a 20 20 2a 2a 20 20 20 20 29 3b 0a  ject.  **    );.
0c50: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 71    **.  ** The sq
0c60: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
0c70: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  e contains a sin
0c80: 67 6c 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  gle entry for ea
0c90: 63 68 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e  ch table.  ** an
0ca0: 64 20 65 61 63 68 20 69 6e 64 65 78 2e 20 20 54  d each index.  T
0cb0: 68 65 20 22 74 79 70 65 22 20 66 69 65 6c 64 20  he "type" field 
0cc0: 74 65 6c 6c 73 20 77 68 65 74 68 65 72 20 74 68  tells whether th
0cd0: 65 20 65 6e 74 72 79 20 69 73 0a 20 20 2a 2a 20  e entry is.  ** 
0ce0: 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
0cf0: 2e 20 20 54 68 65 20 22 6e 61 6d 65 22 20 66 69  .  The "name" fi
0d00: 65 6c 64 20 69 73 20 74 68 65 20 6e 61 6d 65 20  eld is the name 
0d10: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 20  of the object.. 
0d20: 20 2a 2a 20 54 68 65 20 22 74 62 6c 5f 6e 61 6d   ** The "tbl_nam
0d30: 65 22 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e" is the name o
0d40: 66 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  f the associated
0d50: 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 74 61 62   table.  For tab
0d60: 6c 65 73 2c 0a 20 20 2a 2a 20 74 68 65 20 74 62  les,.  ** the tb
0d70: 6c 5f 6e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  l_name field is 
0d80: 61 6c 77 61 79 73 20 74 68 65 20 73 61 6d 65 20  always the same 
0d90: 61 73 20 6e 61 6d 65 2e 20 20 46 6f 72 20 69 6e  as name.  For in
0da0: 64 69 63 65 73 2c 20 74 68 65 0a 20 20 2a 2a 20  dices, the.  ** 
0db0: 74 62 6c 5f 6e 61 6d 65 20 66 69 65 6c 64 20 63  tbl_name field c
0dc0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
0dd0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
0de0: 61 74 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  at the index.  *
0df0: 2a 20 69 6e 64 65 78 65 73 2e 20 20 46 69 6e 61  * indexes.  Fina
0e00: 6c 6c 79 2c 20 74 68 65 20 73 71 6c 20 66 69 65  lly, the sql fie
0e10: 6c 64 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ld contains the 
0e20: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
0e30: 0a 20 20 2a 2a 20 74 68 65 20 43 52 45 41 54 45  .  ** the CREATE
0e40: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
0e50: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
0e60: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 6c 79   that originally
0e70: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 74 68   created.  ** th
0e80: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
0e90: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
0ea0: 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 67 72 61  following progra
0eb0: 6d 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 63 61  m invokes its ca
0ec0: 6c 6c 62 61 63 6b 20 6f 6e 20 74 68 65 20 53 51  llback on the SQ
0ed0: 4c 20 66 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20  L for each.  ** 
0ee0: 74 61 62 6c 65 20 74 68 65 6e 20 67 6f 65 73 20  table then goes 
0ef0: 62 61 63 6b 20 61 6e 64 20 69 6e 76 6f 6b 65 73  back and invokes
0f00: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
0f10: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 66 6f   the.  ** SQL fo
0f20: 72 20 65 61 63 68 20 69 6e 64 65 78 2e 20 20 54  r each index.  T
0f30: 68 65 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  he callback will
0f40: 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
0f50: 20 70 61 72 73 65 72 20 74 6f 20 62 75 69 6c 64   parser to build
0f60: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65   the internal re
0f70: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
0f80: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
0f90: 65 20 73 63 68 65 6d 65 2e 0a 20 20 2a 2f 0a 20  e scheme..  */. 
0fa0: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 69   static VdbeOp i
0fb0: 6e 69 74 50 72 6f 67 5b 5d 20 3d 20 7b 0a 20 20  nitProg[] = {.  
0fc0: 20 20 7b 20 4f 50 5f 4f 70 65 6e 2c 20 20 20 20    { OP_Open,    
0fd0: 20 30 2c 20 30 2c 20 20 4d 41 53 54 45 52 5f 4e   0, 0,  MASTER_N
0fe0: 41 4d 45 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 4e  AME},.    { OP_N
0ff0: 65 78 74 2c 20 20 20 20 20 30 2c 20 38 2c 20 20  ext,     0, 8,  
1000: 30 7d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0},           /*
1010: 20 31 20 2a 2f 0a 20 20 20 20 7b 20 4f 50 5f 46   1 */.    { OP_F
1020: 69 65 6c 64 2c 20 20 20 20 30 2c 20 30 2c 20 20  ield,    0, 0,  
1030: 30 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 53 74 72  0},.    { OP_Str
1040: 69 6e 67 2c 20 20 20 30 2c 20 30 2c 20 20 22 74  ing,   0, 0,  "t
1050: 61 62 6c 65 22 7d 2c 0a 20 20 20 20 7b 20 4f 50  able"},.    { OP
1060: 5f 4e 65 2c 20 20 20 20 20 20 20 30 2c 20 31 2c  _Ne,       0, 1,
1070: 20 20 30 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 46    0},.    { OP_F
1080: 69 65 6c 64 2c 20 20 20 20 30 2c 20 33 2c 20 20  ield,    0, 3,  
1090: 30 7d 2c 0a 20 20 20 20 7b 20 4f 50 5f 43 61 6c  0},.    { OP_Cal
10a0: 6c 62 61 63 6b 2c 20 31 2c 20 30 2c 20 20 30 7d  lback, 1, 0,  0}
10b0: 2c 0a 20 20 20 20 7b 20 4f 50 5f 47 6f 74 6f 2c  ,.    { OP_Goto,
10c0: 20 20 20 20 20 30 2c 20 31 2c 20 20 30 7d 2c 0a       0, 1,  0},.
10d0: 20 20 20 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c      { OP_Rewind,
10e0: 20 20 20 30 2c 20 30 2c 20 20 30 7d 2c 20 20 20     0, 0,  0},   
10f0: 20 20 20 20 20 20 20 20 2f 2a 20 38 20 2a 2f 0a          /* 8 */.
1100: 20 20 20 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 20      { OP_Next,  
1110: 20 20 20 30 2c 20 31 36 2c 20 30 7d 2c 20 20 20     0, 16, 0},   
1120: 20 20 20 20 20 20 20 20 2f 2a 20 39 20 2a 2f 0a          /* 9 */.
1130: 20 20 20 20 7b 20 4f 50 5f 46 69 65 6c 64 2c 20      { OP_Field, 
1140: 20 20 20 30 2c 20 30 2c 20 20 30 7d 2c 0a 20 20     0, 0,  0},.  
1150: 20 20 7b 20 4f 50 5f 53 74 72 69 6e 67 2c 20 20    { OP_String,  
1160: 20 30 2c 20 30 2c 20 20 22 69 6e 64 65 78 22 7d   0, 0,  "index"}
1170: 2c 0a 20 20 20 20 7b 20 4f 50 5f 4e 65 2c 20 20  ,.    { OP_Ne,  
1180: 20 20 20 20 20 30 2c 20 39 2c 20 20 30 7d 2c 0a       0, 9,  0},.
1190: 20 20 20 20 7b 20 4f 50 5f 46 69 65 6c 64 2c 20      { OP_Field, 
11a0: 20 20 20 30 2c 20 33 2c 20 20 30 7d 2c 0a 20 20     0, 3,  0},.  
11b0: 20 20 7b 20 4f 50 5f 43 61 6c 6c 62 61 63 6b 2c    { OP_Callback,
11c0: 20 31 2c 20 30 2c 20 20 30 7d 2c 0a 20 20 20 20   1, 0,  0},.    
11d0: 7b 20 4f 50 5f 47 6f 74 6f 2c 20 20 20 20 20 30  { OP_Goto,     0
11e0: 2c 20 39 2c 20 20 30 7d 2c 0a 20 20 20 20 7b 20  , 9,  0},.    { 
11f0: 4f 50 5f 48 61 6c 74 2c 20 20 20 20 20 30 2c 20  OP_Halt,     0, 
1200: 30 2c 20 20 30 7d 2c 20 20 20 20 20 20 20 20 20  0,  0},         
1210: 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 7d 3b 0a    /* 16 */.  };.
1220: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 76  .  /* Create a v
1230: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 74  irtual machine t
1240: 6f 20 72 75 6e 20 74 68 65 20 69 6e 69 74 69 61  o run the initia
1250: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 67 72 61 6d  lization program
1260: 2e 20 20 52 75 6e 0a 20 20 2a 2a 20 74 68 65 20  .  Run.  ** the 
1270: 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 20 64 65  program.  The de
1280: 6c 65 74 65 20 74 68 65 20 76 69 72 74 75 61 6c  lete the virtual
1290: 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20   machine..  */. 
12a0: 20 76 64 62 65 20 3d 20 73 71 6c 69 74 65 56 64   vdbe = sqliteVd
12b0: 62 65 43 72 65 61 74 65 28 64 62 2d 3e 70 42 65  beCreate(db->pBe
12c0: 29 3b 0a 20 20 69 66 28 20 76 64 62 65 3d 3d 30  );.  if( vdbe==0
12d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
12e0: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
12f0: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
1300: 22 2c 30 29 3b 20 0a 20 20 20 20 72 65 74 75 72  ",0); .    retur
1310: 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 1;.  }.  sqlit
1320: 65 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 76  eVdbeAddOpList(v
1330: 64 62 65 2c 20 73 69 7a 65 6f 66 28 69 6e 69 74  dbe, sizeof(init
1340: 50 72 6f 67 29 2f 73 69 7a 65 6f 66 28 69 6e 69  Prog)/sizeof(ini
1350: 74 50 72 6f 67 5b 30 5d 29 2c 20 69 6e 69 74 50  tProg[0]), initP
1360: 72 6f 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  rog);.  rc = sql
1370: 69 74 65 56 64 62 65 45 78 65 63 28 76 64 62 65  iteVdbeExec(vdbe
1380: 2c 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 2c 20  , sqliteOpenCb, 
1390: 64 62 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  db, pzErrMsg);. 
13a0: 20 73 71 6c 69 74 65 56 64 62 65 44 65 6c 65 74   sqliteVdbeDelet
13b0: 65 28 76 64 62 65 29 3b 0a 20 20 69 66 28 20 72  e(vdbe);.  if( r
13c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13d0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
13e0: 0a 20 20 20 20 63 68 61 72 20 2a 61 7a 41 72 67  .    char *azArg
13f0: 5b 32 5d 3b 0a 20 20 20 20 61 7a 41 72 67 5b 30  [2];.    azArg[0
1400: 5d 20 3d 20 6d 61 73 74 65 72 5f 73 63 68 65 6d  ] = master_schem
1410: 61 3b 0a 20 20 20 20 61 7a 41 72 67 5b 31 5d 20  a;.    azArg[1] 
1420: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 4f  = 0;.    sqliteO
1430: 70 65 6e 43 62 28 64 62 2c 20 31 2c 20 61 7a 41  penCb(db, 1, azA
1440: 72 67 2c 20 30 29 3b 0a 20 20 20 20 70 54 61 62  rg, 0);.    pTab
1450: 20 3d 20 73 71 6c 69 74 65 46 69 6e 64 54 61 62   = sqliteFindTab
1460: 6c 65 28 64 62 2c 20 4d 41 53 54 45 52 5f 4e 41  le(db, MASTER_NA
1470: 4d 45 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  ME);.    if( pTa
1480: 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  b ){.      pTab-
1490: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
14a0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
14b0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 69  gs |= SQLITE_Ini
14c0: 74 69 61 6c 69 7a 65 64 3b 0a 20 20 7d 65 6c 73  tialized;.  }els
14d0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 74 72  e{.    sqliteStr
14e0: 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67  Realloc(pzErrMsg
14f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1500: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1510: 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64  n a new SQLite d
1520: 61 74 61 62 61 73 65 2e 20 20 43 6f 6e 73 74 72  atabase.  Constr
1530: 75 63 74 20 61 6e 20 22 73 71 6c 69 74 65 22 20  uct an "sqlite" 
1540: 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 66  structure to def
1550: 69 6e 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  ine.** the state
1560: 20 6f 66 20 74 68 69 73 20 64 61 74 61 62 61 73   of this databas
1570: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
1580: 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73  ointer to that s
1590: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
15a0: 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
15b0: 64 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  de to initialize
15c0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
15d0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 74  ata structures t
15e0: 68 61 74 0a 2a 2a 20 68 6f 6c 64 20 74 68 65 20  hat.** hold the 
15f0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1600: 20 20 42 75 74 20 69 66 20 74 68 69 73 20 66 61    But if this fa
1610: 69 6c 73 20 28 62 65 63 61 75 73 65 20 74 68 65  ils (because the
1620: 20 73 63 68 65 6d 61 20 66 69 6c 65 0a 2a 2a 20   schema file.** 
1630: 69 73 20 6c 6f 63 6b 65 64 29 20 74 68 65 6e 20  is locked) then 
1640: 74 68 61 74 20 73 74 65 70 20 69 73 20 64 65 66  that step is def
1650: 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  erred until the 
1660: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 2a 2a  first call to.**
1670: 20 73 71 6c 69 74 65 5f 65 78 65 63 28 29 2e 0a   sqlite_exec()..
1680: 2a 2f 0a 73 71 6c 69 74 65 20 2a 73 71 6c 69 74  */.sqlite *sqlit
1690: 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e_open(const cha
16a0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
16b0: 74 20 6d 6f 64 65 2c 20 63 68 61 72 20 2a 2a 70  t mode, char **p
16c0: 7a 45 72 72 4d 73 67 29 7b 0a 20 20 73 71 6c 69  zErrMsg){.  sqli
16d0: 74 65 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  te *db;.  int rc
16e0: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
16f0: 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
1700: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1710: 64 62 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  db = sqliteMallo
1720: 63 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  c( sizeof(sqlite
1730: 29 20 29 3b 0a 20 20 69 66 28 20 70 7a 45 72 72  ) );.  if( pzErr
1740: 4d 73 67 20 29 20 2a 70 7a 45 72 72 4d 73 67 20  Msg ) *pzErrMsg 
1750: 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  = 0;.  if( db==0
1760: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
1770: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
1780: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
1790: 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 0);.    sqlit
17a0: 65 53 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72  eStrRealloc(pzEr
17b0: 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
17c0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  n 0;.  }.  .  /*
17d0: 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
17e0: 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
17f0: 72 20 2a 2f 0a 20 20 64 62 2d 3e 70 42 65 20 3d  r */.  db->pBe =
1800: 20 73 71 6c 69 74 65 44 62 62 65 4f 70 65 6e 28   sqliteDbbeOpen(
1810: 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 6d 6f 64 65  zFilename, (mode
1820: 26 30 32 32 32 29 21 3d 30 2c 20 6d 6f 64 65 21  &0222)!=0, mode!
1830: 3d 30 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  =0, pzErrMsg);. 
1840: 20 69 66 28 20 64 62 2d 3e 70 42 65 3d 3d 30 20   if( db->pBe==0 
1850: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 74 72  ){.    sqliteStr
1860: 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d 73 67  Realloc(pzErrMsg
1870: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1880: 65 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  e(db);.    retur
1890: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  n 0;.  }..  /* A
18a0: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
18b0: 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 72  he schema */.  r
18c0: 63 20 3d 20 73 71 6c 69 74 65 49 6e 69 74 28 64  c = sqliteInit(d
18d0: 62 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20  b, pzErrMsg);.  
18e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18f0: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1900: 42 55 53 59 20 29 7b 0a 20 20 20 20 73 71 6c 69  BUSY ){.    sqli
1910: 74 65 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  te_close(db);.  
1920: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
1930: 6c 73 65 7b 0a 20 20 20 20 66 72 65 65 28 2a 70  lse{.    free(*p
1940: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 2a 70  zErrMsg);.    *p
1950: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
1960: 0a 20 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a  .  return db;.}.
1970: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
1980: 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20  existing SQLite 
1990: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 76 6f 69 64  database.*/.void
19a0: 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28 73 71   sqlite_close(sq
19b0: 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 69 6e 74  lite *db){.  int
19c0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 44 62 62 65   i;.  sqliteDbbe
19d0: 43 6c 6f 73 65 28 64 62 2d 3e 70 42 65 29 3b 0a  Close(db->pBe);.
19e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 48    for(i=0; i<N_H
19f0: 41 53 48 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  ASH; i++){.    T
1a00: 61 62 6c 65 20 2a 70 4e 65 78 74 2c 20 2a 70 4c  able *pNext, *pL
1a10: 69 73 74 20 3d 20 64 62 2d 3e 61 70 54 62 6c 48  ist = db->apTblH
1a20: 61 73 68 5b 69 5d 3b 0a 20 20 20 20 64 62 2d 3e  ash[i];.    db->
1a30: 61 70 54 62 6c 48 61 73 68 5b 69 5d 20 3d 20 30  apTblHash[i] = 0
1a40: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 4c 69  ;.    while( pLi
1a50: 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  st ){.      pNex
1a60: 74 20 3d 20 70 4c 69 73 74 2d 3e 70 48 61 73 68  t = pList->pHash
1a70: 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70  ;.      pList->p
1a80: 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
1a90: 73 71 6c 69 74 65 44 65 6c 65 74 65 54 61 62 6c  sqliteDeleteTabl
1aa0: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1ab0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
1ac0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
1ad0: 71 6c 69 74 65 46 72 65 65 28 64 62 29 3b 0a 7d  qliteFree(db);.}
1ae0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1af0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
1b00: 20 53 51 4c 20 73 74 72 69 6e 67 20 65 6e 64 73   SQL string ends
1b10: 20 69 6e 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 2e   in a semicolon.
1b20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 5f 63  .*/.int sqlite_c
1b30: 6f 6d 70 6c 65 74 65 28 63 6f 6e 73 74 20 63 68  omplete(const ch
1b40: 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74  ar *zSql){.  int
1b50: 20 69 3b 0a 20 20 69 6e 74 20 6c 61 73 74 57 61   i;.  int lastWa
1b60: 73 53 65 6d 69 20 3d 20 30 3b 0a 0a 20 20 69 20  sSemi = 0;..  i 
1b70: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  = 0;.  while( i>
1b80: 3d 30 20 26 26 20 7a 53 71 6c 5b 69 5d 21 3d 30  =0 && zSql[i]!=0
1b90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 6b 65   ){.    int toke
1ba0: 6e 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e  nType;.    int n
1bb0: 3b 0a 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  ;..    n = sqlit
1bc0: 65 47 65 74 54 6f 6b 65 6e 28 26 7a 53 71 6c 5b  eGetToken(&zSql[
1bd0: 69 5d 2c 20 26 74 6f 6b 65 6e 54 79 70 65 29 3b  i], &tokenType);
1be0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 74 6f 6b  .    switch( tok
1bf0: 65 6e 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  enType ){.      
1c00: 63 61 73 65 20 54 4b 5f 53 50 41 43 45 3a 0a 20  case TK_SPACE:. 
1c10: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4d       case TK_COM
1c20: 4d 45 4e 54 3a 0a 20 20 20 20 20 20 20 20 62 72  MENT:.        br
1c30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
1c40: 54 4b 5f 53 45 4d 49 3a 0a 20 20 20 20 20 20 20  TK_SEMI:.       
1c50: 20 6c 61 73 74 57 61 73 53 65 6d 69 20 3d 20 31   lastWasSemi = 1
1c60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1c70: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
1c80: 20 20 20 20 20 20 20 20 6c 61 73 74 57 61 73 53          lastWasS
1c90: 65 6d 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  emi = 0;.       
1ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1cb0: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 7d 0a 20 20    i += n;.  }.  
1cc0: 72 65 74 75 72 6e 20 6c 61 73 74 57 61 73 53 65  return lastWasSe
1cd0: 6d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  mi;.}../*.** Exe
1ce0: 63 75 74 65 20 53 51 4c 20 63 6f 64 65 2e 20 20  cute SQL code.  
1cf0: 52 65 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68  Return one of th
1d00: 65 20 53 51 4c 49 54 45 5f 20 73 75 63 63 65 73  e SQLITE_ succes
1d10: 73 2f 66 61 69 6c 75 72 65 0a 2a 2a 20 63 6f 64  s/failure.** cod
1d20: 65 73 2e 20 20 41 6c 73 6f 20 77 72 69 74 65 20  es.  Also write 
1d30: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1d40: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
1d50: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61  ained from.** ma
1d60: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 61 6b 65 20  lloc() and make 
1d70: 2a 70 7a 45 72 72 4d 73 67 20 70 6f 69 6e 74 20  *pzErrMsg point 
1d80: 74 6f 20 74 68 61 74 20 6d 65 73 73 61 67 65 2e  to that message.
1d90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  .**.** If the SQ
1da0: 4c 20 69 73 20 61 20 71 75 65 72 79 2c 20 74 68  L is a query, th
1db0: 65 6e 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  en for each row 
1dc0: 69 6e 20 74 68 65 20 71 75 65 72 79 20 72 65 73  in the query res
1dd0: 75 6c 74 0a 2a 2a 20 74 68 65 20 78 43 61 6c 6c  ult.** the xCall
1de0: 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20  back() function 
1df0: 69 73 20 63 61 6c 6c 65 64 2e 20 20 70 41 72 67  is called.  pArg
1e00: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 66 69 72   becomes the fir
1e10: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  st.** argument t
1e20: 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 2e 20 20  o xCallback().  
1e30: 49 66 20 78 43 61 6c 6c 62 61 63 6b 3d 4e 55 4c  If xCallback=NUL
1e40: 4c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61  L then no callba
1e50: 63 6b 0a 2a 2a 20 69 73 20 69 6e 76 6f 6b 65 64  ck.** is invoked
1e60: 2c 20 65 76 65 6e 20 66 6f 72 20 71 75 65 72 69  , even for queri
1e70: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1e80: 65 5f 65 78 65 63 28 0a 20 20 73 71 6c 69 74 65  e_exec(.  sqlite
1e90: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
1ea0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1eb0: 61 62 61 73 65 20 6f 6e 20 77 68 69 63 68 20 74  abase on which t
1ec0: 68 65 20 53 51 4c 20 65 78 65 63 75 74 65 73 20  he SQL executes 
1ed0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 2c  */.  char *zSql,
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 20 2f 2a 20 54 68 65 20 53 51 4c 20 74 6f 20 62   /* The SQL to b
1f00: 65 20 65 78 65 63 75 74 65 64 20 2a 2f 0a 20 20  e executed */.  
1f10: 73 71 6c 69 74 65 5f 63 61 6c 6c 62 61 63 6b 20  sqlite_callback 
1f20: 78 43 61 6c 6c 62 61 63 6b 2c 20 20 2f 2a 20 49  xCallback,  /* I
1f30: 6e 76 6f 6b 65 20 74 68 69 73 20 63 61 6c 6c 62  nvoke this callb
1f40: 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  ack routine */. 
1f50: 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20   void *pArg,    
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f70: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
1f80: 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
1f90: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
1fa0: 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  sg             /
1fb0: 2a 20 57 72 69 74 65 20 65 72 72 6f 72 20 6d 65  * Write error me
1fc0: 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 29  ssages here */.)
1fd0: 7b 0a 20 20 50 61 72 73 65 20 73 50 61 72 73 65  {.  Parse sParse
1fe0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1ff0: 66 28 20 70 7a 45 72 72 4d 73 67 20 29 20 2a 70  f( pzErrMsg ) *p
2000: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69  zErrMsg = 0;.  i
2010: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  f( (db->flags & 
2020: 53 51 4c 49 54 45 5f 49 6e 69 74 69 61 6c 69 7a  SQLITE_Initializ
2030: 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ed)==0 ){.    in
2040: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 49 6e 69  t rc = sqliteIni
2050: 74 28 64 62 2c 20 70 7a 45 72 72 4d 73 67 29 3b  t(db, pzErrMsg);
2060: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2070: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2080: 72 63 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  rc;.  }.  memset
2090: 28 26 73 50 61 72 73 65 2c 20 30 2c 20 73 69 7a  (&sParse, 0, siz
20a0: 65 6f 66 28 73 50 61 72 73 65 29 29 3b 0a 20 20  eof(sParse));.  
20b0: 73 50 61 72 73 65 2e 64 62 20 3d 20 64 62 3b 0a  sParse.db = db;.
20c0: 20 20 73 50 61 72 73 65 2e 78 43 61 6c 6c 62 61    sParse.xCallba
20d0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
20e0: 20 20 73 50 61 72 73 65 2e 70 41 72 67 20 3d 20    sParse.pArg = 
20f0: 70 41 72 67 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pArg;.  rc = sql
2100: 69 74 65 52 75 6e 50 61 72 73 65 72 28 26 73 50  iteRunParser(&sP
2110: 61 72 73 65 2c 20 7a 53 71 6c 2c 20 70 7a 45 72  arse, zSql, pzEr
2120: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 53  rMsg);.  sqliteS
2130: 74 72 52 65 61 6c 6c 6f 63 28 70 7a 45 72 72 4d  trRealloc(pzErrM
2140: 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sg);.  return rc
2150: 3b 0a 7d 0a                                      ;.}.