/ Hex Artifact Content
Login

Artifact b7c993274ee2a029937b0bc4815bdef80b330017:


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 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61   *v;..  db = pPa
0f40: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
0f50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0f60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0f70: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29  pParse->nested )
0f80: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
0f90: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
0fa0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  turn;..  /* Begi
0fb0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
0fc0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
0fd0: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
0fe0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
0ff0: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1000: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1010: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1020: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1030: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1040: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1050: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1060: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
1070: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
1080: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1090: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
10a0: 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Halt);..    /* T
10b0: 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63  he cookie mask c
10c0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20  ontains one bit 
10d0: 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73  for each databas
10e0: 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20  e file open..   
10f0: 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f   ** (Bit 0 is fo
1100: 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73  r main, bit 1 is
1110: 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73   for temp, and s
1120: 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20  o forth.)  Bits 
1130: 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66  are.    ** set f
1140: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1150: 20 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   that is used.  
1160: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1170: 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20   start a.    ** 
1180: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65  transaction on e
1190: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
11a0: 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20  e and to verify 
11b0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
11c0: 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68  e.    ** on each
11d0: 20 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a   used database..
11e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11f0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1200: 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79 44 62  o>0 ){.      yDb
1210: 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20 20 20  Mask mask;.     
1220: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
1230: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1240: 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63  ere(v, pParse->c
1250: 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20  ookieGoto-1);.  
1260: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d      for(iDb=0, m
1270: 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e  ask=1; iDb<db->n
1280: 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44  Db; mask<<=1, iD
1290: 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  b++){.        if
12a0: 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  ( (mask & pParse
12b0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30  ->cookieMask)==0
12c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12e0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
12f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1300: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f  e3VdbeAddOp2(v,O
1310: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1320: 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72  Db, (mask & pPar
1330: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d  se->writeMask)!=
1340: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1350: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
1360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1370: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1380: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1390: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
13a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 56 65  eAddOp3(v, OP_Ve
13c0: 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20 20 20  rifyCookie,.    
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 69 44 62 2c 20 70 50 61          iDb, pPa
13f0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
1400: 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20 20 20  [iDb],.         
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1430: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
1440: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  tion);.        }
1450: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
1460: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1470: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
1480: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
1490: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
14a0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
14b0: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
14c0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61         char *vta
14d0: 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  b = (char *)sqli
14e0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
14f0: 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c   pParse->apVtabL
1500: 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ock[i]);.       
1510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1520: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1530: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1540: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1560: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1570: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  = 0;.      }.#en
1580: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
1590: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
15a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
15b0: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
15c0: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
15d0: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
15e0: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
15f0: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1600: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1610: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1620: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1630: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
1640: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
1650: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
1660: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
1670: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
1680: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
1690: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
16a0: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
16b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
16c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
16d0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
16e0: 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d   /* Finally, jum
16f0: 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  p back to the be
1700: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 65  ginning of the e
1710: 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65 2e 20  xecutable code. 
1720: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1730: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1740: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
1750: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20  ->cookieGoto);. 
1760: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
1770: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
1780: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
1790: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
17a0: 69 66 28 20 76 20 26 26 20 41 4c 57 41 59 53 28  if( v && ALWAYS(
17b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29  pParse->nErr==0)
17c0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
17d0: 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20  ailed ){.#ifdef 
17e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
17f0: 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28   FILE *trace = (
1800: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1810: 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30  TE_VdbeTrace)!=0
1820: 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20   ? stdout : 0;. 
1830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
1840: 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23  ace(v, trace);.#
1850: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1860: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
1870: 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  Level==0 );  /* 
1880: 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d  Disables and re-
1890: 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f  enables match */
18a0: 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75  .    /* A minimu
18b0: 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20  m of one cursor 
18c0: 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61  is required if a
18d0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20  utoincrement is 
18e0: 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20  used.    *  See 
18f0: 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63  ticket [a696379c
1900: 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20  1f08866] */.    
1910: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  if( pParse->pAin
1920: 63 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  c!=0 && pParse->
1930: 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65  nTab==0 ) pParse
1940: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  ->nTab = 1;.    
1950: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1960: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 2d 3e  eady(v, pParse->
1970: 6e 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d  nVar, pParse->nM
1980: 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
19a0: 72 73 65 2d 3e 6e 54 61 62 2c 20 70 50 61 72 73  rse->nTab, pPars
19b0: 65 2d 3e 6e 4d 61 78 41 72 67 2c 20 70 50 61 72  e->nMaxArg, pPar
19c0: 73 65 2d 3e 65 78 70 6c 61 69 6e 2c 0a 20 20 20  se->explain,.   
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 73        pParse->is
19f0: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
1a00: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
1a10: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1a20: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1a30: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
1a40: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
1a50: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
1a60: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
1a70: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
1a80: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
1a90: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
1aa0: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1ab0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1ac0: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
1ad0: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
1ae0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1af0: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
1b00: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1b10: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1b20: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1b30: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1b40: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
1b50: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
1b60: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
1b70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1b80: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
1b90: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
1ba0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1bb0: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1bc0: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1bd0: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1be0: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1bf0: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1c00: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1c10: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1c20: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1c30: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1c40: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1c50: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1c60: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1c70: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1c80: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1c90: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1ca0: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1cb0: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1cc0: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1cd0: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1ce0: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1cf0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1d00: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1d10: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
1d20: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
1d30: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
1d40: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
1d50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1d60: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1d70: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1d80: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1d90: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1da0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1db0: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1dc0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1dd0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1de0: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
1df0: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
1e00: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
1e10: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1e20: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1e30: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1e40: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1e50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1e60: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1e70: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1e80: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1e90: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1ea0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1eb0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
1ec0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
1ed0: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
1ee0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1ef0: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1f00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1f10: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1f20: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1f30: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1f40: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1f50: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1f60: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1f70: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1f80: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1f90: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1fa0: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1fb0: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
1fc0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1fd0: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1fe0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1ff0: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
2000: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
2010: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
2020: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
2030: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
2040: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2050: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2060: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2070: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2080: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2090: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
20a0: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
20b0: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
20c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
20d0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
20e0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
20f0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2100: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2110: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2120: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2130: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
2140: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
2150: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
2160: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
2170: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
2180: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
2190: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
21a0: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
21b0: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
21c0: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
21d0: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
21e0: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
21f0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2200: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2210: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2220: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2230: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
2240: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2250: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
2260: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
2270: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
2280: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
2290: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
22a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
22b0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73  int nName;.  ass
22c0: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
22d0: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
22e0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
22f0: 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  );.  /* All mute
2300: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2310: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2320: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2330: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2340: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2350: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
2360: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
2370: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66  texes(db) );.  f
2380: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
2390: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
23a0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
23b0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
23c0: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
23d0: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
23e0: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
23f0: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2400: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2410: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2420: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
2430: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2440: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2450: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2460: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
2470: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
2480: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
2490: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
24a0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
24b0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
24c0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
24d0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
24e0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
24f0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2500: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2510: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2520: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2530: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2540: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2550: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2560: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2570: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2580: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2590: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
25a0: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
25b0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
25c0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
25d0: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
25e0: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
25f0: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2600: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2610: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2620: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2630: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
2640: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2650: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
2660: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
2670: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
2680: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
2690: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
26a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
26b0: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
26c0: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
26d0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
26e0: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
26f0: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2700: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2710: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2720: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2730: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
2740: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
2750: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
2760: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
2770: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
2780: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2790: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
27a0: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
27b0: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
27c0: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
27d0: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
27e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
27f0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2800: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2810: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2820: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2830: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
2840: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
2850: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
2860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2870: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
2880: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
2890: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
28a0: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
28b0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
28c0: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
28d0: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
28e0: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
28f0: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2900: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2910: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2920: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2930: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
2940: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
2950: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2960: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2970: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
2980: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
2990: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
29a0: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
29b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
29c0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
29d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
29e0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
29f0: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2a00: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2a10: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2a20: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2a30: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2a40: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2a50: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2a60: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2a70: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2a80: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2a90: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2aa0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2ab0: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2ac0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2ad0: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2ae0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2af0: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2b00: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2b10: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2b20: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2b30: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2b40: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2b50: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2b60: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2b70: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2b80: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2b90: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2ba0: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2bb0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2bc0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2bd0: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2be0: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2bf0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2c00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2c10: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2c20: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2c30: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2c40: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2c50: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2c60: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2c70: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2c80: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2c90: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2ca0: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2cb0: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2cc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2cd0: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2ce0: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2cf0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2d00: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2d10: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2d20: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2d30: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2d40: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2d50: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2d60: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2d70: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2d80: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2d90: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2da0: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
2db0: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
2dc0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
2dd0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
2de0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2df0: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2e00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2e20: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
2e30: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2e40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2e50: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
2e60: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
2e70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e80: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
2e90: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2ea0: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
2eb0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2ec0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2ed0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2ee0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2ef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2f00: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2f10: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2f20: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2f30: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2f40: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2f50: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2f60: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2f70: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2f80: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2f90: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2fa0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2fb0: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2fc0: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2fd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2fe0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2ff0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3000: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
3010: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
3020: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
3030: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
3040: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
3050: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3060: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3070: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
3080: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
3090: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
30a0: 48 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  Hash;.  len = sq
30b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
30c0: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
30d0: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
30e0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
30f0: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3100: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3110: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3120: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3130: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
3140: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
3150: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
3160: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3170: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3180: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
3190: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
31a0: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
31b0: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
31c0: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
31d0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
31e0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
31f0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3200: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3210: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3220: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3230: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
3240: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
3250: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
3260: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
3270: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
3280: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
3290: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
32a0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
32b0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
32c0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
32d0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
32e0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
32f0: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
3300: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
3310: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
3320: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
3330: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
3340: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3350: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
3360: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
3370: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
3380: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
3390: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
33a0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
33b0: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
33c0: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
33d0: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
33e0: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
33f0: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3400: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
3420: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
3430: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
3440: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
3450: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
3460: 2e 20 20 49 66 20 69 44 62 3e 3d 30 20 74 68 65  .  If iDb>=0 the
3470: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
3480: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
3490: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
34a0: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
34b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
34c0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
34d0: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
34e0: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69  b, int iDb){.  i
34f0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72  nt i, j;.  asser
3500: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
3510: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
3520: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
3530: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
3540: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
3550: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
3560: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3570: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
3580: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3590: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
35a0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
35b0: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
35c0: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
35d0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
35e0: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
35f0: 61 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  a);..    /* If a
3600: 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65  ny database othe
3610: 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72  r than TEMP is r
3620: 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20  eset, then also 
3630: 72 65 73 65 74 20 54 45 4d 50 0a 20 20 20 20 2a  reset TEMP.    *
3640: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
3650: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
3660: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
3670: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
3680: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
3690: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
36a0: 2f 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31  /.    if( iDb!=1
36b0: 20 29 7b 0a 20 20 20 20 20 20 70 44 62 20 3d 20   ){.      pDb = 
36c0: 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20 20  &db->aDb[1];.   
36d0: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
36e0: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
36f0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3700: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
3710: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
3720: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a  return;.  }.  /*
3730: 20 43 61 73 65 20 32 20 28 66 72 6f 6d 20 68 65   Case 2 (from he
3740: 72 65 20 74 6f 20 74 68 65 20 65 6e 64 29 3a 20  re to the end): 
3750: 52 65 73 65 74 20 61 6c 6c 20 73 63 68 65 6d 61  Reset all schema
3760: 73 20 66 6f 72 20 61 6c 6c 20 61 74 74 61 63 68  s for all attach
3770: 65 64 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  ed.  ** database
3780: 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
3790: 69 44 62 3c 30 20 29 3b 0a 20 20 73 71 6c 69 74  iDb<0 );.  sqlit
37a0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
37b0: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
37c0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
37d0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
37e0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
37f0: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
3800: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3810: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3820: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3830: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
3840: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3850: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
3860: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
3870: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
3880: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
3890: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  db);..  /* If on
38a0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
38b0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
38c0: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
38d0: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
38e0: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d  then remove them
38f0: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
3900: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
3910: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
3920: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
3930: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
3940: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
3950: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
3960: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
3970: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
3980: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
3990: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
39a0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
39b0: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
39c0: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
39d0: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
39e0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
39f0: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3a00: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3a10: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3a20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3a30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
3a40: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
3a50: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
3a60: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
3a70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
3a80: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
3a90: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
3aa0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
3ab0: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
3ac0: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
3ad0: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
3ae0: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
3af0: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
3b00: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
3b10: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
3b20: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
3b30: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
3b40: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
3b50: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
3b60: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
3b70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
3b80: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
3b90: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
3ba0: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
3bb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3bc0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3bd0: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3be0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3bf0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3c00: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3c10: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3c20: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3c30: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3c40: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
3c50: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
3c60: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
3c70: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
3c80: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
3c90: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
3ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3cb0: 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
3cc0: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
3cd0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
3ce0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
3cf0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
3d00: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
3d10: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
3d20: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
3d30: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3d40: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3d50: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3d70: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
3d80: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
3d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3da0: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
3db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3dc0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
3dd0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
3de0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3df0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
3e00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3e10: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
3e20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3e30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3e40: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3e60: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3e70: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3e80: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3e90: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
3ea0: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
3eb0: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
3ec0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3ed0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3ee0: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3ef0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3f00: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3f10: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3f20: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3f30: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3f40: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3f50: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3f60: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3f70: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3f80: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3f90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3fa0: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3fb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3fc0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3fd0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3fe0: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3ff0: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
4000: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61  ..  assert( !pTa
4010: 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e  ble || pTable->n
4020: 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  Ref>0 );..  /* D
4030: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
4040: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
4050: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4060: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
4070: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
4080: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4090: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
40a0: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
40b0: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
40c0: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )>0) ) return;..
40d0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
40e0: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
40f0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4100: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4110: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4120: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4130: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4140: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4150: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4160: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4170: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4180: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
4190: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
41a0: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
41b0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
41c0: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
41d0: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
41e0: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
41f0: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4200: 73 65 72 74 28 0a 09 20 20 26 70 49 6e 64 65 78  sert(..  &pIndex
4210: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4220: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  sh, zName, sqlit
4230: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
4240: 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ), 0.      );.  
4250: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
4260: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
4270: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4280: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
4290: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
42a0: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
42b0: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
42c0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
42d0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
42e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
42f0: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4300: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4310: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4320: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4330: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
4340: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
4350: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
4360: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
4370: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
4380: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
4390: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
43a0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
43b0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
43c0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
43d0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
43e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
43f0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
4400: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
4410: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
4420: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
4430: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
4440: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69  ->pCheck);.#endi
4450: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
4460: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4470: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
4480: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
4490: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
44a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
44b0: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
44c0: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
44d0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
44e0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
44f0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
4500: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
4510: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4520: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4530: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
4540: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
4550: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
4560: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4570: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4580: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
4590: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
45a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
45b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
45c0: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
45d0: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
45e0: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
45f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4600: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4610: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4620: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
4630: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
4640: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
4650: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
4660: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
4670: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
4680: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
4690: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
46a0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
46b0: 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  abName,.        
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
46e0: 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20  zTabName),0);.  
46f0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4700: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
4710: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4720: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4730: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
4740: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
4750: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
4760: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
4770: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
4780: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
4790: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
47a0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
47b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
47c0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
47d0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
47e0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
47f0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
4800: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
4810: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
4820: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
4830: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
4840: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
4850: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
4860: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
4870: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
4880: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
4890: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
48a0: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
48b0: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
48c0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
48d0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
48e0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
48f0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
4900: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
4910: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
4920: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4930: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4940: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
4950: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4960: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
4970: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
4980: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
4990: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
49a0: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
49b0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
49c0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
49d0: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
49e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
49f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
4a00: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
4a10: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
4a20: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
4a30: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
4a40: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
4a50: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
4a60: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
4a70: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
4a80: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
4a90: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
4aa0: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
4ab0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
4ac0: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
4ad0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
4ae0: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
4af0: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
4b00: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
4b10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4b20: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
4b30: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
4b40: 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
4b50: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4b60: 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50  -1, (char *)5, P
4b70: 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20  4_INT32);  /* 5 
4b80: 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a  column table */.
4b90: 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30    if( p->nTab==0
4ba0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20   ){.    p->nTab 
4bb0: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
4bc0: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d  * Parameter zNam
4bd0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  e points to a nu
4be0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66  l-terminated buf
4bf0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
4c00: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
4c10: 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22  database ("main"
4c20: 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  , "temp" or the 
4c30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4c40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a  hed db). This.**
4c50: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4c60: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4c70: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4c80: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4c90: 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20  or.** -1 if the 
4ca0: 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20  named db cannot 
4cb0: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
4cc0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
4cd0: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
4ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4cf0: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
4d00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
4d10: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4d20: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4d30: 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
4d40: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4d50: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
4d60: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
4d70: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
4d80: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
4d90: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
4da0: 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50   if( (!OMIT_TEMP
4db0: 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20  DB || i!=1 ) && 
4dc0: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
4dd0: 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26  30(pDb->zName) &
4de0: 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d  & .          0==
4df0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
4e00: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  Db->zName, zName
4e10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
4e20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4e30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
4e40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
4e50: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
4e60: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
4e70: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
4e80: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
4e90: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
4ea0: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
4eb0: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
4ec0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
4ed0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
4ee0: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
4ef0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
4f00: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4f10: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
4f20: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
4f30: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
4f40: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4f50: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
4f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4f90: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
4fa0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4fc0: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
4fd0: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
4fe0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4ff0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
5000: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
5010: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5020: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
5030: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5040: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
5050: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
5060: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
5070: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
5080: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
5090: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
50a0: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
50b0: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
50c0: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
50d0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
50e0: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
50f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5100: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
5110: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5120: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5130: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5140: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5150: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
5160: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
5170: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5180: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
5190: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
51a0: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
51b0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
51c0: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
51d0: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
51e0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
51f0: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
5200: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5210: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5220: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
5230: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
5240: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
5250: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
5260: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
5270: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
5280: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
5290: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
52a0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
52b0: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
52c0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
52d0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
52e0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
52f0: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
5300: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5310: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5320: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5330: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
5340: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
5350: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5360: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
5370: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
5380: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
5390: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
53a0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
53b0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
53c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
53d0: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
53e0: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
53f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5400: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
5410: 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30  ALWAYS(pName2!=0
5420: 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  ) && pName2->n>0
5430: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
5440: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
5450: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5460: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
5470: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
5480: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
5490: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
54a0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
54b0: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
54c0: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
54d0: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
54e0: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
54f0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
5500: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5510: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
5520: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
5530: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
5540: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5550: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5560: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
5570: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
5580: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
5590: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
55a0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
55b0: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
55c0: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
55d0: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
55e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
55f0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
5600: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
5610: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
5620: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
5630: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
5640: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
5650: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
5660: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
5670: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
5680: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
5690: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
56a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
56b0: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
56c0: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
56d0: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
56e0: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
56f0: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
5700: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
5710: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
5720: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
5730: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
5740: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
5750: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5760: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
5770: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
5780: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
5790: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
57a0: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
57b0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
57c0: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
57d0: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
57e0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
57f0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
5800: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
5810: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5820: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
5830: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
5840: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
5850: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
5860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5870: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
5880: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5890: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
58a0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
58b0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
58c0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
58d0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
58e0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
58f0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
5900: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
5910: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
5920: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5930: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
5940: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
5950: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5960: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
5970: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
5980: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
5990: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
59a0: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
59b0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
59c0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
59d0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
59e0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
59f0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
5a00: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
5a10: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
5a20: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
5a30: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
5a40: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
5a50: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
5a60: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
5a70: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
5a80: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
5a90: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
5aa0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
5ab0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
5ac0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
5ad0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
5ae0: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
5af0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
5b00: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
5b10: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
5b20: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
5b30: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
5b40: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
5b50: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
5b60: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
5b70: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
5b80: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
5b90: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
5ba0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
5bb0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
5bc0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
5bd0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
5be0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
5bf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
5c00: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
5c10: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
5c20: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5c30: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
5c40: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
5c50: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5c60: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5c70: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
5c80: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
5c90: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
5ca0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5cb0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
5cc0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
5cd0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5ce0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
5cf0: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
5d00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5d10: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
5d20: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
5d30: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
5d40: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
5d50: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
5d60: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
5d70: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
5d80: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
5d90: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
5da0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
5db0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
5dc0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
5dd0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
5de0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5df0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
5e00: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
5e10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5e20: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
5e30: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
5e40: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
5e50: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
5e60: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
5e70: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
5e80: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
5e90: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
5ea0: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
5eb0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5ec0: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5ed0: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
5ee0: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5ef0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5f00: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5f10: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
5f20: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5f30: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
5f40: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
5f50: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5f60: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
5f70: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5f80: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
5f90: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
5fa0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
5fb0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
5fc0: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
5fd0: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5fe0: 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ..);.  **.  ** T
5ff0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
6000: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
6010: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
6020: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
6030: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
6040: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
6050: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
6060: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
6070: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
6080: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
6090: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
60a0: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
60b0: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
60c0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
60d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
60e0: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
60f0: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
6100: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
6110: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
6120: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
6130: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
6140: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
6150: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
6160: 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54  urn;.  if( !OMIT
6170: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6180: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6190: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
61a0: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
61b0: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
61c0: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
61d0: 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e  be qualified. Un
61e0: 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65  less .    ** the
61f0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
6200: 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e  s "temp" anyway.
6210: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
6220: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6230: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
6240: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
6250: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
6260: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6270: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6280: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
6290: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
62a0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
62b0: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
62c0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
62d0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
62e0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
62f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6300: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6310: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6320: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
6330: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
6340: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6350: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
6360: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
6370: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
6380: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6390: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
63a0: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
63b0: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
63c0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
63d0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
63e0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
63f0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6400: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6410: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
6420: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6430: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
6440: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6450: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6460: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
6470: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
6480: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6490: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
64a0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
64b0: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
64c0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
64d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
64e0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
64f0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
6500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6510: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6520: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6530: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
6540: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6550: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
6560: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6570: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6580: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
6590: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
65a0: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
65b0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
65c0: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
65d0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
65e0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
65f0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6600: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6610: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6620: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6630: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
6640: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
6650: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
6660: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
6670: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
6680: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
6690: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
66a0: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
66b0: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
66c0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
66d0: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
66e0: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
66f0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6700: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
6710: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6720: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6730: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
6740: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
6750: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
6760: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
6770: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
6780: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
6790: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
67a0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
67b0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
67c0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53  zName;.    if( S
67d0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
67e0: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
67f0: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
6800: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6810: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6820: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6830: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
6840: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  me, zDb);.    if
6850: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
6860: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
6870: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6880: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6890: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
68a0: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
68b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
68c0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
68d0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
68e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
68f0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
6900: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
6910: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6920: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
6930: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
6940: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
6950: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
6960: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6970: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6980: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
6990: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
69a0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
69b0: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
69c0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  le==0 ){.    db-
69d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
69e0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  1;.    pParse->r
69f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6a00: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
6a10: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62  rr++;.    goto b
6a20: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6a30: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
6a40: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
6a50: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
6a60: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
6a70: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
6a80: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
6a90: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20   pTable->nRef = 
6aa0: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f  1;.  pTable->nRo
6ab0: 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a  wEst = 1000000;.
6ac0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
6ad0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
6ae0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
6af0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
6b00: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
6b10: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
6b20: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
6b30: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
6b40: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
6b50: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
6b60: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
6b70: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6b80: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
6b90: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
6ba0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
6bb0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
6bc0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
6bd0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
6be0: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
6bf0: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
6c00: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
6c10: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
6c20: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
6c30: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
6c40: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
6c50: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
6c60: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
6c70: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
6c80: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6c90: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
6ca0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
6cb0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
6cc0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
6cd0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
6ce0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
6cf0: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
6d00: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
6d10: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
6d20: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
6d30: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6d40: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
6d50: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
6d60: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
6d70: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
6d80: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
6d90: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
6da0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
6db0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
6dc0: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
6dd0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
6de0: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
6df0: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
6e00: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
6e10: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6e20: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
6e30: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
6e40: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
6e50: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
6e60: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
6e70: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
6e80: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
6e90: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
6ea0: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
6eb0: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
6ec0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
6ed0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
6ee0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
6ef0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6f00: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6f10: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
6f20: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
6f30: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
6f40: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
6f50: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
6f60: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
6f70: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
6f80: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
6f90: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
6fa0: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
6fb0: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
6fc0: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
6fd0: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
6fe0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
6ff0: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
7000: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
7010: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7020: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
7030: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
7040: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7050: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
7060: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
7070: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
7080: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
7090: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
70a0: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
70b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
70c0: 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20  P_If, reg3);.   
70d0: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
70e0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
70f0: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
7100: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
7110: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
7120: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
7130: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
7140: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7150: 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72  Integer, fileFor
7160: 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  mat, reg3);.    
7170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7180: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
7190: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49  e, iDb, BTREE_FI
71a0: 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29  LE_FORMAT, reg3)
71b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
71c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
71d0: 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20  teger, ENC(db), 
71e0: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
71f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7200: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
7210: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
7220: 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20  CODING, reg3);. 
7230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
7240: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
7250: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
7260: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
7270: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
7280: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
7290: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
72a0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
72b0: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
72c0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
72d0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
72e0: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
72f0: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
7300: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
7310: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
7320: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
7330: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
7340: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
7350: 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72  try is left in r
7360: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
7370: 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a  regRowid..    **
7380: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
7390: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
73a0: 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69   table is left i
73b0: 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65  n reg pParse->re
73c0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68  gRoot..    ** Th
73d0: 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74  e rowid and root
73e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c   page number val
73f0: 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62  ues are needed b
7400: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a  y the code that.
7410: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e      ** sqlite3En
7420: 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65  dTable will gene
7430: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
7440: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7450: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
7460: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7470: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7480: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
7490: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
74a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
74b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
74c0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
74d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
74e0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  if.    {.      s
74f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7500: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
7510: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
7520: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7530: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
7540: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
7550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7560: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
7570: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
7580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7590: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
75a0: 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   0, reg3);.    s
75b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
75c0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
75d0: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
75e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
75f0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7600: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
7610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7620: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
7630: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
7640: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
7650: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
7660: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
7670: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
7680: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
7690: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
76a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
76b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
76c0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
76d0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
76e0: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
76f0: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
7700: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
7710: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
7720: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
7730: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
7740: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
7750: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
7760: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
7770: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
7780: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
7790: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
77a0: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
77b0: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
77c0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
77d0: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
77e0: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
77f0: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
7800: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
7810: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
7820: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
7830: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
7840: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
7850: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
7860: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
7870: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
7880: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
7890: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
78a0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
78b0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
78c0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
78d0: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
78e0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
78f0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
7900: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
7910: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
7920: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
7930: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7940: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
7950: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
7960: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
7970: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
7980: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
7990: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
79a0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
79b0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
79c0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
79d0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
79e0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
79f0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
7a00: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
7a10: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
7a20: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
7a30: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
7a40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
7a50: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
7a60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
7a70: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
7a80: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
7a90: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
7aa0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
7ab0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7ac0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
7ad0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
7ae0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
7af0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
7b00: 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  f.  z = sqlite3N
7b10: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7b20: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
7b30: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7b40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
7b50: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
7b60: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
7b70: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
7b80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7b90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7ba0: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
7bb0: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
7bc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
7bd0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
7be0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7bf0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
7c00: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
7c10: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
7c20: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
7c30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
7c40: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
7c50: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
7c60: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
7c70: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
7c80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7c90: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7ca0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7cb0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
7cc0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
7cd0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
7ce0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
7cf0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
7d00: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
7d10: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
7d20: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
7d30: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
7d40: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
7d50: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
7d60: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
7d70: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
7d80: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
7d90: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
7da0: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
7db0: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
7dc0: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
7dd0: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
7de0: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
7df0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
7e00: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
7e10: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
7e20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7e30: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
7e40: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
7e50: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
7e60: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
7e70: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7e80: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
7e90: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
7ea0: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
7eb0: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
7ec0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
7ed0: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
7ee0: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
7ef0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
7f00: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
7f10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
7f20: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
7f30: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
7f40: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
7f50: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
7f60: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
7f70: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
7f80: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
7f90: 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d  rn;.  p->aCol[p-
7fa0: 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c  >nCol-1].notNull
7fb0: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
7fc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
7fd0: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
7fe0: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
7ff0: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
8000: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
8010: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
8020: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
8030: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
8040: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
8050: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
8060: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
8070: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
8080: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
8090: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
80a0: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
80b0: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
80c0: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
80d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
80e0: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
80f0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
8100: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
8110: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
8120: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
8130: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
8140: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
8150: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
8160: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
8170: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
8180: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
8190: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
81a0: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
81b0: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
81c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81d0: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
81e0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
81f0: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
8200: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
8210: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8220: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
8230: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8240: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
8250: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
8260: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
8270: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8280: 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20  _NONE.** 'REAL' 
8290: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
82a0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
82b0: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
82c0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
82d0: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
82e0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
82f0: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
8300: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
8310: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
8320: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
8330: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8340: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
8350: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
8360: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
8370: 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20  t char *zIn){.  
8380: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
8390: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
83a0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69  FF_NUMERIC;..  i
83b0: 66 28 20 7a 49 6e 20 29 20 77 68 69 6c 65 28 20  f( zIn ) while( 
83c0: 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20  zIn[0] ){.    h 
83d0: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
83e0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
83f0: 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20  *zIn)&0xff];.   
8400: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
8410: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
8420: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
8430: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
8440: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
8450: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8460: 54 45 5f 41 46 46 5f 54 45 58 54 3b 20 0a 20 20  TE_AFF_TEXT; .  
8470: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8480: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
8490: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
84a0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
84b0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
84c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
84d0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
84e0: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
84f0: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
8500: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
8510: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
8520: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8530: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
8540: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
8550: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
8560: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
8570: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
8580: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
8590: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
85a0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
85b0: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
85c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
85d0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66  TE_AFF_NONE;.#if
85e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
85f0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
8600: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8610: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
8620: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
8630: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
8640: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
8650: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
8660: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
8670: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8680: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
8690: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
86a0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
86b0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
86c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
86d0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
86e0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
86f0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
8700: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8710: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
8720: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
8730: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
8740: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
8750: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
8760: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
8770: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8780: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
8790: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
87a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
87b0: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
87c0: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
87d0: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
87e0: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
87f0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8800: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
8810: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8820: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8830: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
8840: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8850: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8860: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8870: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8880: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8890: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
88a0: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
88b0: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
88c0: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
88d0: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
88e0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
88f0: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
8900: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
8910: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8920: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
8930: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
8940: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
8950: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
8960: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
8970: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
8980: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
8990: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
89a0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
89b0: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
89c0: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
89d0: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
89e0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
89f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
8a00: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
8a10: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
8a20: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70   *pCol;..  p = p
8a30: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8a40: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
8a50: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
8a60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
8a70: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
8a80: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nCol-1];.  asser
8a90: 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d  t( pCol->zType==
8aa0: 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  0 );.  pCol->zTy
8ab0: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
8ac0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
8ad0: 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20  ->db, pType);.  
8ae0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
8af0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
8b00: 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Type(pCol->zType
8b10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
8b20: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
8b30: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
8b40: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
8b50: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
8b60: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
8b70: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
8b80: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8b90: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
8ba0: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
8bb0: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
8bc0: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
8bd0: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
8be0: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
8bf0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8c00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8c10: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8c20: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8c30: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8c40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8c50: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
8c60: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
8c70: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
8c80: 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e  pParse, ExprSpan
8c90: 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c   *pSpan){.  Tabl
8ca0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
8cb0: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
8cc0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8cd0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
8ce0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
8cf0: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
8d00: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
8d10: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
8d20: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
8d30: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
8d40: 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72  ion(pSpan->pExpr
8d50: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
8d60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8d70: 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75  e, "default valu
8d80: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d  e of column [%s]
8d90: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
8da0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
8db0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
8dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
8dd0: 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69   copy of pExpr i
8de0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  s used instead o
8df0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20  f the original, 
8e00: 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e  as pExpr contain
8e10: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e  s.      ** token
8e20: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
8e30: 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e  volatile memory.
8e40: 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74   The 'span' of t
8e50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
8e60: 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
8e70: 65 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62  ed by pragma tab
8e80: 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a  le_info..      *
8e90: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
8ea0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
8eb0: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
8ec0: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
8ed0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8ee0: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c  b, pSpan->pExpr,
8ef0: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
8f00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
8f10: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
8f20: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43  zDflt);.      pC
8f30: 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69  ol->zDflt = sqli
8f40: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
8f50: 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a   (char*)pSpan->z
8f60: 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20  Start,.         
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
8f90: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
8fa0: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
8fb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8fc0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8fd0: 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29  b, pSpan->pExpr)
8fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  ;.}../*.** Desig
8ff0: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
9000: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
9010: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
9020: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
9030: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
9040: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
9050: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
9060: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
9070: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
9080: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
9090: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
90a0: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
90b0: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
90c0: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
90d0: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
90e0: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
90f0: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
9100: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
9110: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
9120: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
9130: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
9140: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
9150: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
9160: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
9170: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
9180: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
9190: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
91a0: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
91b0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
91c0: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
91d0: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
91e0: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
91f0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
9200: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
9210: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
9220: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
9230: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
9240: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
9250: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
9260: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
9270: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
9280: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
9290: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
92a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
92b0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
92c0: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
92d0: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
92e0: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
92f0: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
9300: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
9310: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
9320: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
9330: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
9340: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9350: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
9360: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
9370: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
9380: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
9390: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
93a0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
93b0: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
93c0: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
93d0: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
93e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
93f0: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
9400: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
9410: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
9420: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
9430: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
9440: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
9450: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
9460: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9470: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79  ble;.  char *zTy
9480: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  pe = 0;.  int iC
9490: 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66  ol = -1, i;.  if
94a0: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f  ( pTab==0 || IN_
94b0: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
94c0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
94d0: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
94e0: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
94f0: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b  HasPrimaryKey ){
9500: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
9510: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
9520: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
9530: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
9540: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
9550: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
9560: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
9570: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
9580: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
9590: 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79  |= TF_HasPrimary
95a0: 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  Key;.  if( pList
95b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
95c0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
95d0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
95e0: 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79  [iCol].isPrimKey
95f0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
9600: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
9610: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
9620: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  {.      for(iCol
9630: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
9640: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
9650: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9660: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
9670: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
9680: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
9690: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
96a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
96b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
96c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62     if( iCol<pTab
96d0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
96e0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
96f0: 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31  l].isPrimKey = 1
9700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9710: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
9720: 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20  Expr>1 ) iCol = 
9730: 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  -1;.  }.  if( iC
9740: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
9750: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
9760: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
9770: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
9780: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20    }.  if( zType 
9790: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
97a0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
97b0: 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  R")==0.        &
97c0: 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c  & sortOrder==SQL
97d0: 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20  ITE_SO_ASC ){.  
97e0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
97f0: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
9800: 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e  keyConf = (u8)on
9810: 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  Error;.    asser
9820: 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c  t( autoInc==0 ||
9830: 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20   autoInc==1 );. 
9840: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
9850: 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f  s |= autoInc*TF_
9860: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20  Autoincrement;. 
9870: 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49   }else if( autoI
9880: 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  nc ){.#ifndef SQ
9890: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
98a0: 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69  CREMENT.    sqli
98b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
98c0: 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45  se, "AUTOINCREME
98d0: 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77  NT is only allow
98e0: 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20  ed on an ".     
98f0: 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41    "INTEGER PRIMA
9900: 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66  RY KEY");.#endif
9910: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e  .  }else{.    In
9920: 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  dex *p;.    p = 
9930: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
9940: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
9950: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
9960: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
9970: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  der, 0);.    if(
9980: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61   p ){.      p->a
9990: 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  utoIndex = 2;.  
99a0: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
99b0: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
99c0: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
99d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
99e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
99f0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
9a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
9a10: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
9a20: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
9a30: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9a40: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9a50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9a60: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
9a70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9a80: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
9a90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9aa0: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
9ab0: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
9ac0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
9ad0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9ae0: 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
9af0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
9b00: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
9b10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
9b20: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
9b30: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
9b40: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 54 61  _VTAB ){.    pTa
9b50: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
9b60: 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
9b70: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68  Tab->pCheck, pCh
9b80: 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73  eckExpr);.  }els
9b90: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
9ba0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9bb0: 74 65 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70  te(db, pCheckExp
9bc0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
9bd0: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
9be0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
9bf0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9c00: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
9c10: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
9c20: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
9c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9c40: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
9c50: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
9c60: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
9c70: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
9c80: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9ca0: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
9cb0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9cc0: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
9cd0: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
9ce0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9cf0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
9d00: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
9d10: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
9d20: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
9d30: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
9d40: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
9d50: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
9d60: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
9d70: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
9d80: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
9d90: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
9da0: 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43  *pIdx;.    p->aC
9db0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
9dc0: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
9dd0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
9de0: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
9df0: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
9e00: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
9e10: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
9e20: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
9e30: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
9e40: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
9e50: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
9e60: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
9e70: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
9e80: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
9e90: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
9ea0: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
9eb0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
9ec0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9ed0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
9ee0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  x->nColumn==1 );
9ef0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
9f00: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
9f10: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
9f20: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
9f30: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
9f40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9f50: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
9f60: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
9f70: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
9f80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9f90: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
9fa0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
9fb0: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
9fc0: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
9fd0: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
9fe0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
9ff0: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
a000: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
a010: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
a020: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
a030: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
a040: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
a050: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
a060: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
a070: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
a080: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
a090: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
a0a0: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
a0b0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
a0c0: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
a0d0: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
a0e0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
a0f0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
a100: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
a110: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
a120: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
a130: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
a140: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
a150: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
a160: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
a170: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
a180: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
a190: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
a1a0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a1b0: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
a1c0: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
a1d0: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
a1e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a1f0: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
a200: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
a210: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
a220: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
a230: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
a240: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
a250: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
a260: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
a270: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
a280: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
a290: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  age..**.** See a
a2a0: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64  lso: sqlite3Find
a2b0: 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74  CollSeq(), sqlit
a2c0: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a  e3GetCollSeq().*
a2d0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
a2e0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
a2f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
a300: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
a310: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
a320: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
a330: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
a340: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
a350: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
a360: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
a370: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
a380: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
a390: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
a3a0: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
a3b0: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
a3c0: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
a3d0: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
a3e0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
a3f0: 65 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  etCollSeq(db, en
a400: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
a410: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
a420: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a430: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a440: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61  , "no such colla
a450: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25  tion sequence: %
a460: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
a470: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
a480: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
a490: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a4a0: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
a4b0: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
a4c0: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
a4d0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
a4e0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
a4f0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
a500: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
a510: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
a520: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
a530: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
a540: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
a550: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
a560: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
a570: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
a580: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
a590: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
a5a0: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
a5b0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
a5c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
a5d0: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
a5e0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
a5f0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
a600: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
a610: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
a620: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
a630: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
a640: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
a650: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
a660: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
a670: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
a680: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
a690: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
a6a0: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
a6b0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
a6c0: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
a6d0: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
a6e0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
a6f0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
a700: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
a710: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
a720: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
a730: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
a740: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
a750: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
a760: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
a770: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
a780: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
a790: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
a7a0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a7b0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
a7c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a7d0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a7e0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
a7f0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
a800: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
a810: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c  iDb, 0) );.  sql
a820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a830: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
a840: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
a850: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
a860: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
a870: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a880: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
a890: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
a8a0: 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20  _VERSION, r1);. 
a8b0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
a8c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
a8d0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
a8e0: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
a8f0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
a900: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
a910: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
a920: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
a930: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
a940: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
a950: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
a960: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
a970: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
a980: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
a990: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
a9a0: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
a9b0: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
a9c0: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
a9d0: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
a9e0: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
a9f0: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
aa00: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
aa10: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
aa20: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
aa30: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
aa40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
aa50: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
aa60: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
aa70: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
aa80: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
aa90: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
aaa0: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
aab0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
aac0: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
aad0: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
aae0: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
aaf0: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
ab00: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
ab10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
ab20: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
ab30: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
ab40: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
ab50: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
ab60: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
ab70: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
ab80: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
ab90: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
aba0: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
abb0: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
abc0: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
abd0: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
abe0: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
abf0: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
ac00: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
ac10: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
ac20: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
ac30: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
ac40: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
ac50: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
ac60: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
ac70: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
ac80: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
ac90: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
aca0: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
acb0: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
acc0: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
acd0: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
ace0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
acf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
ad00: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
ad10: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
ad20: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
ad30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
ad40: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
ad50: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
ad60: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
ad70: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
ad80: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
ad90: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
ada0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
adb0: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
adc0: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
add0: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
ade0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
adf0: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
ae00: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
ae10: 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79  ]) || sqlite3Key
ae20: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
ae30: 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66   j)!=TK_ID;.  if
ae40: 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a  ( !needQuote ){.
ae50: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
ae60: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a  zIdent[j];.  }..
ae70: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
ae80: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
ae90: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
aea0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
aeb0: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
aec0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
aed0: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
aee0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
aef0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
af00: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
af10: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
af20: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
af30: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
af40: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
af50: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
af60: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
af70: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
af80: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
af90: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
afa0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
afb0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
afc0: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
afd0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
afe0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
aff0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
b000: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
b010: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
b020: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
b030: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
b040: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
b050: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
b060: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
b070: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
b080: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
b090: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
b0a0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
b0b0: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
b0c0: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
b0d0: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
b0e0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
b0f0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
b100: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
b110: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
b120: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
b130: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
b140: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
b150: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
b160: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
b170: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
b180: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
b190: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
b1a0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
b1b0: 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  w(0, n);.  if( z
b1c0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
b1d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b1e0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
b1f0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
b200: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
b210: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
b220: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
b230: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
b240: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
b250: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
b260: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
b270: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
b280: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
b290: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
b2a0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
b2b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
b2c0: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
b2d0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
b2e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
b2f0: 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a      */ " TEXT",.
b300: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
b310: 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f  E_AFF_NONE    */
b320: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20   "",.        /* 
b330: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
b340: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
b350: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
b360: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
b370: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
b380: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
b390: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
b3a0: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
b3b0: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
b3c0: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
b3d0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b3e0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
b3f0: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
b400: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b410: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
b420: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
b430: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
b440: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
b450: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
b460: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
b470: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
b480: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
b490: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
b4a0: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ty-SQLITE_AFF_TE
b4b0: 58 54 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  XT < ArraySize(a
b4c0: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65  zType) );.    te
b4d0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
b4e0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
b4f0: 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74  FF_TEXT );.    t
b500: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
b510: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
b520: 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20  AFF_NONE );.    
b530: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
b540: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
b550: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
b560: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
b570: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
b580: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
b590: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b5a0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
b5b0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
b5c0: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
b5d0: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
b5e0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
b5f0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a  LITE_AFF_TEXT];.
b600: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
b610: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
b620: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
b630: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
b640: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20  LITE_AFF_NONE . 
b650: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
b660: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
b670: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
b680: 65 28 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20  e(zType) );.    
b690: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
b6a0: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
b6b0: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
b6c0: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
b6d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
b6e0: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
b6f0: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
b700: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
b710: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
b720: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b730: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
b740: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
b750: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
b760: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
b770: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
b780: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
b790: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
b7a0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
b7b0: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
b7c0: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
b7d0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
b7e0: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
b7f0: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
b800: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
b810: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
b820: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
b830: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
b840: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
b850: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
b860: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
b870: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
b880: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
b890: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
b8a0: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
b8b0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
b8c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
b8d0: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
b8e0: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
b8f0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
b900: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
b910: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
b920: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
b930: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
b940: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
b950: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
b960: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
b970: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b980: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
b990: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
b9a0: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
b9b0: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
b9c0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
b9d0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
b9e0: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
b9f0: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
ba00: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
ba10: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
ba20: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
ba30: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
ba40: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
ba50: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
ba60: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
ba70: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
ba80: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
ba90: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
baa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bab0: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
bac0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
bad0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
bae0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
baf0: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
bb00: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
bb10: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
bb20: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
bb30: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
bb40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
bb50: 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f  The final ')' to
bb60: 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54  ken in the CREAT
bb70: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c  E TABLE */.  Sel
bb80: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
bb90: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
bba0: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
bbb0: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
bbc0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
bbd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bbe0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
bbf0: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45   iDb;..  if( (pE
bc00: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
bc10: 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ==0) || db->mall
bc20: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
bc30: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20  return;.  }.  p 
bc40: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
bc50: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
bc60: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
bc70: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
bc80: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
bc90: 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  );..  iDb = sqli
bca0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
bcb0: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
bcc0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
bcd0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
bce0: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
bcf0: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
bd00: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
bd10: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
bd20: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
bd30: 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20   SrcList sSrc;  
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74   /* Fake SrcList
bd60: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65   for pParse->pNe
bd70: 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61  wTable */.    Na
bd80: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bda0: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
bdb0: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
bdc0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  ble */..    mems
bdd0: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
bde0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65  of(sNC));.    me
bdf0: 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73  mset(&sSrc, 0, s
be00: 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20  izeof(sSrc));.  
be10: 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b    sSrc.nSrc = 1;
be20: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a  .    sSrc.a[0].z
be30: 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b  Name = p->zName;
be40: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70  .    sSrc.a[0].p
be50: 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53 72  Tab = p;.    sSr
be60: 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d  c.a[0].iCursor =
be70: 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61   -1;.    sNC.pPa
be80: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
be90: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
bea0: 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e   &sSrc;.    sNC.
beb0: 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20  isCheck = 1;.   
bec0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
bed0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
bee0: 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b  C, p->pCheck) ){
bef0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
bf00: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
bf10: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
bf20: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
bf30: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  /..  /* If the d
bf40: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
bf50: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
bf60: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
bf70: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
bf80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
bf90: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
bfa0: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
bfb0: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
bfc0: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
bfd0: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
bfe0: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
bff0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
c000: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
c010: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
c020: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
c030: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
c040: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
c050: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
c060: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
c070: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
c080: 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e.).  */.  if( d
c090: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
c0a0: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62      p->tnum = db
c0b0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
c0c0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74    }..  /* If not
c0d0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74   initializing, t
c0e0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65 63  hen create a rec
c0f0: 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ord for the new 
c100: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
c110: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
c120: 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74  table of the dat
c130: 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  abase..  **.  **
c140: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54 45   If this is a TE
c150: 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77  MPORARY table, w
c160: 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20 69  rite the entry i
c170: 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72  nto the auxiliar
c180: 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74  y.  ** file inst
c190: 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20  ead of into the 
c1a0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
c1b0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  le..  */.  if( !
c1c0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
c1d0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
c1e0: 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
c1f0: 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20  r *zType;    /* 
c200: 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65  "view" or "table
c210: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
c220: 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45  Type2;   /* "VIE
c230: 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f  W" or "TABLE" */
c240: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
c250: 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ;    /* Text of 
c260: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
c270: 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57 20   or CREATE VIEW 
c280: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20  statement */..  
c290: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
c2a0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
c2b0: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
c2c0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  ) ) return;..   
c2d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c2e0: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
c2f0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20  0);..    /* .   
c300: 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a   ** Initialize z
c310: 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77  Type for the new
c320: 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a   view or table..
c330: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c340: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
c350: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c        /* A regul
c360: 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ar table */.    
c370: 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65    zType = "table
c380: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
c390: 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64  = "TABLE";.#ifnd
c3a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
c3b0: 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IEW.    }else{. 
c3c0: 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a       /* A view *
c3d0: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
c3e0: 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54  "view";.      zT
c3f0: 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23  ype2 = "VIEW";.#
c400: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
c410: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
c420: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
c430: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20   AS SELECT ..., 
c440: 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c 45  execute the SELE
c450: 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  CT.    ** statem
c460: 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ent to populate 
c470: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54  the new table. T
c480: 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  he root-page num
c490: 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ber for the.    
c4a0: 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  ** new table is 
c4b0: 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72  in register pPar
c4c0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
c4d0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20   **.    ** Once 
c4e0: 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62  the SELECT has b
c4f0: 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c  een coded by sql
c500: 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74  ite3Select(), it
c510: 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20   is in a.    ** 
c520: 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20 74  suitable state t
c530: 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 20  o query for the 
c540: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64  column names and
c550: 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73 65   types to be use
c560: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
c570: 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  new table..    *
c580: 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65  *.    ** A share
c590: 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f  d-cache write-lo
c5a0: 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ck is not requir
c5b0: 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
c5c0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20  he new table,.  
c5d0: 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61    ** as a schema
c5e0: 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20  -lock must have 
c5f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74  already been obt
c600: 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20  ained to create 
c610: 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a  it. Since.    **
c620: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65   a schema-lock e
c630: 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65  xcludes all othe
c640: 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72 73  r database users
c650: 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  , the write-lock
c660: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65   would.    ** be
c670: 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20   redundant..    
c680: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
c690: 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ct ){.      Sele
c6a0: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
c6b0: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
c6c0: 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  b;..      assert
c6d0: 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31  (pParse->nTab==1
c6e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c6f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c700: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70  _OpenWrite, 1, p
c710: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20  Parse->regRoot, 
c720: 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
c730: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
c740: 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 50 61  v, 1);.      pPa
c750: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
c760: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
c770: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
c780: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b  , SRT_Table, 1);
c790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
c7a0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
c7b0: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
c7c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c7d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
c7e0: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 1);.      if(
c7f0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
c800: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
c810: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
c820: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
c830: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
c840: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
c850: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
c860: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c870: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
c880: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
c890: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
c8a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
c8b0: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
c8c0: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
c8d0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
c8e0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
c8f0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
c900: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
c910: 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
c920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
c930: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
c940: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
c950: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
c960: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
c970: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
c980: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
c990: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
c9a0: 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
c9b0: 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
c9c0: 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65  pEnd->z - pParse
c9d0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20  ->sNameToken.z) 
c9e0: 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74  + 1;.      zStmt
c9f0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
ca00: 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  f(db, .         
ca10: 20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73   "CREATE %s %.*s
ca20: 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50  ", zType2, n, pP
ca30: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
ca40: 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .z.      );.    
ca50: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  }..    /* A slot
ca60: 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
ca70: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
ca80: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
ca90: 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
caa0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
cab0: 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
cac0: 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
cad0: 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
cae0: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
caf0: 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
cb00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
cb10: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
cb20: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55  pParse,.      "U
cb30: 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20  PDATE %Q.%s ".  
cb40: 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65         "SET type
cb50: 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20  ='%s', name=%Q, 
cb60: 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f  tbl_name=%Q, roo
cb70: 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25  tpage=#%d, sql=%
cb80: 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52  Q ".       "WHER
cb90: 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20  E rowid=#%d",.  
cba0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
cbb0: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
cbc0: 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
cbd0: 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
cbe0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
cbf0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50  >zName,.      pP
cc00: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20  arse->regRoot,. 
cc10: 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20       zStmt,.    
cc20: 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77    pParse->regRow
cc30: 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  id.    );.    sq
cc40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
cc50: 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
cc60: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
cc70: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23  pParse, iDb);..#
cc80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cc90: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
cca0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
ccb0: 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
ccc0: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
ccd0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
cce0: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
ccf0: 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
cd00: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
cd10: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
cd20: 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ( p->tabFlags & 
cd30: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
cd40: 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44   ){.      Db *pD
cd50: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
cd60: 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
cd70: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
cd80: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
cd90: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28   0) );.      if(
cda0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
cdb0: 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
cdc0: 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
cdd0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
cde0: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
cdf0: 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
ce00: 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
ce10: 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
ce20: 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20   pDb->zName.    
ce30: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
ce40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
ce50: 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72   /* Reparse ever
ce60: 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65  ything to update
ce70: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61   our internal da
ce80: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
ce90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cea0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72  AddOp4(v, OP_Par
ceb0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
cec0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c  , 0,.        sql
ced0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
cee0: 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c  "tbl_name='%q'",
cef0: 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59  p->zName), P4_DY
cf00: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20  NAMIC);.  }...  
cf10: 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65  /* Add the table
cf20: 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   to the in-memor
cf30: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
cf40: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
cf50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
cf60: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
cf70: 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20    Table *pOld;. 
cf80: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
cf90: 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b  ma = p->pSchema;
cfa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
cfb0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
cfc0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
cfd0: 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71  );.    pOld = sq
cfe0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
cff0: 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
d000: 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  h, p->zName,.   
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d030: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61  3Strlen30(p->zNa
d040: 6d 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28 20  me),p);.    if( 
d050: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
d060: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
d070: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
d080: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
d090: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
d0a0: 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   */.      db->ma
d0b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
d0c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
d0d0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
d0e0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
d0f0: 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b     db->nTable++;
d100: 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
d110: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
d120: 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66  hanges;..#ifndef
d130: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
d140: 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ERTABLE.    if( 
d150: 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  !p->pSelect ){. 
d160: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d170: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
d180: 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73  char *)pParse->s
d190: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  NameToken.z;.   
d1a0: 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20     int nName;.  
d1b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65      assert( !pSe
d1c0: 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26  lect && pCons &&
d1d0: 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69   pEnd );.      i
d1e0: 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29  f( pCons->z==0 )
d1f0: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20  {.        pCons 
d200: 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  = pEnd;.      }.
d210: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69        nName = (i
d220: 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20  nt)((const char 
d230: 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61  *)pCons->z - zNa
d240: 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  me);.      p->ad
d250: 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20  dColOffset = 13 
d260: 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  + sqlite3Utf8Cha
d270: 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  rLen(zName, nNam
d280: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
d290: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
d2a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
d2b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65  ./*.** The parse
d2c0: 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
d2d0: 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  tine in order to
d2e0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49   create a new VI
d2f0: 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  EW.*/.void sqlit
d300: 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20  e3CreateView(.  
d310: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d320: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
d330: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
d340: 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20  oken *pBegin,   
d350: 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
d360: 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
d370: 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  s the statement 
d380: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
d390: 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e1,     /* The t
d3a0: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
d3b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d3c0: 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  view */.  Token 
d3d0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
d3e0: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  The token that h
d3f0: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  olds the name of
d400: 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53   the view */.  S
d410: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
d420: 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
d430: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
d440: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
d450: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
d460: 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
d470: 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
d480: 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
d490: 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
d4a0: 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
d4b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
d4c0: 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
d4d0: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
d4e0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
d4f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
d500: 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
d510: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
d520: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20   Token *pName;. 
d530: 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69   int iDb;.  sqli
d540: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d550: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
d560: 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20  rse->nVar>0 ){. 
d570: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d580: 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61  sg(pParse, "para
d590: 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61  meters are not a
d5a0: 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22  llowed in views"
d5b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
d5c0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
d5d0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
d5e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
d5f0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
d600: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
d610: 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20  me2, isTemp, 1, 
d620: 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d  0, noErr);.  p =
d630: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
d640: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
d650: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
d660: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
d670: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
d680: 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
d690: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
d6a0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
d6b0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
d6c0: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
d6d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
d6e0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
d6f0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 69 66  ->pSchema);.  if
d700: 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74  ( sqlite3FixInit
d710: 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
d720: 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
d730: 6d 65 29 0a 20 20 20 20 26 26 20 73 71 6c 69 74  me).    && sqlit
d740: 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
d750: 78 2c 20 70 53 65 6c 65 63 74 29 0a 20 20 29 7b  x, pSelect).  ){
d760: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
d770: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
d780: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
d790: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
d7a0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
d7b0: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
d7c0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
d7d0: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
d7e0: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
d7f0: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
d800: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
d810: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
d820: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
d830: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
d840: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
d850: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
d860: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
d870: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
d880: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
d890: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
d8a0: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
d8b0: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
d8c0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
d8d0: 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
d8e0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
d8f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
d900: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
d910: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  lect);.  if( db-
d920: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
d930: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d940: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
d950: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
d960: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
d970: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
d980: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
d990: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
d9a0: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
d9b0: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
d9c0: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
d9d0: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
d9e0: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
d9f0: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
da00: 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e  if( ALWAYS(sEnd.
da10: 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64  z[0]!=0) && sEnd
da20: 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
da30: 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
da40: 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
da50: 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74   = 0;.  n = (int
da60: 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  )(sEnd.z - pBegi
da70: 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n->z);.  z = pBe
da80: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
da90: 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20   ALWAYS(n>0) && 
daa0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
dab0: 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
dac0: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
dad0: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
dae0: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
daf0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
db00: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
db10: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
db20: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
db30: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
db40: 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
db50: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   0);.  return;.}
db60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
db70: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
db80: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
db90: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
dba0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
dbb0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
dbc0: 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
dbd0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
dbe0: 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
dbf0: 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
dc00: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
dc10: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
dc20: 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
dc30: 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
dc40: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
dc50: 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
dc60: 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
dc70: 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
dc80: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
dc90: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
dca0: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
dcb0: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
dcc0: 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
dcd0: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
dce0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
dcf0: 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
dd00: 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
dd10: 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
dd20: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
dd30: 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
dd40: 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
dd50: 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
dd60: 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
dd70: 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
dd80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dd90: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
dda0: 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ddc0: 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
ddd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
dde0: 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
ddf0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
de00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
de10: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
de20: 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
de30: 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  c errors */.  in
de40: 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a  t (*xAuth)(void*
de50: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
de60: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  ,const char*,con
de70: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
de80: 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74  har*);..  assert
de90: 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66  ( pTable );..#if
dea0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
deb0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
dec0: 69 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43  if( sqlite3VtabC
ded0: 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73  allConnect(pPars
dee0: 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20  e, pTable) ){.  
def0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
df00: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
df10: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c   IsVirtual(pTabl
df20: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  e) ) return 0;.#
df30: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
df40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
df50: 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
df60: 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
df70: 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
df80: 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
df90: 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
dfa0: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
dfb0: 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
dfc0: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
dfd0: 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
dfe0: 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
dff0: 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
e000: 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
e010: 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
e020: 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
e030: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
e040: 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
e050: 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
e060: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
e070: 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
e080: 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
e090: 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
e0a0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
e0b0: 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
e0c0: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
e0d0: 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
e0e0: 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
e0f0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
e100: 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
e110: 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72  ctually, the err
e120: 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20  or above is now 
e130: 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
e140: 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f  reaching this po
e150: 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  int..  ** But th
e160: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
e170: 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74   is still import
e180: 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63  ant as it does c
e190: 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74  ome up.  ** in t
e1a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
e1b0: 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  ** .  **     CRE
e1c0: 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65  ATE TABLE main.e
e1d0: 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20  x1(a);.  **     
e1e0: 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57  CREATE TEMP VIEW
e1f0: 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61   ex1 AS SELECT a
e200: 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20   FROM ex1;.  ** 
e210: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
e220: 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f  M temp.ex1;.  */
e230: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
e240: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
e250: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
e260: 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
e270: 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
e280: 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
e290: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
e2a0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
e2b0: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d  ( pTable->nCol>=
e2c0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  0 );..  /* If we
e2d0: 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
e2e0: 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
e2f0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
e300: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
e310: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
e320: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
e330: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
e340: 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
e350: 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
e360: 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
e370: 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
e380: 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
e390: 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
e3a0: 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
e3b0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
e3c0: 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
e3d0: 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
e3e0: 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
e3f0: 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
e400: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
e410: 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
e420: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
e430: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
e440: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
e450: 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
e460: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
e470: 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d  lect );.  pSel =
e480: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
e490: 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  p(db, pTable->pS
e4a0: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
e4b0: 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38 20   pSel ){.    u8 
e4c0: 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20  enableLookaside 
e4d0: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
e4e0: 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20  bEnabled;.    n 
e4f0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
e500: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
e510: 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
e520: 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53  pParse, pSel->pS
e530: 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  rc);.    pTable-
e540: 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  >nCol = -1;.    
e550: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
e560: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e  nabled = 0;.#ifn
e570: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e580: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
e590: 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
e5a0: 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  uth;.    db->xAu
e5b0: 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  th = 0;.    pSel
e5c0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
e5d0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
e5e0: 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20  Parse, pSel);.  
e5f0: 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
e600: 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  uth;.#else.    p
e610: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
e620: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
e630: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
e640: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e  .#endif.    db->
e650: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
e660: 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61  ed = enableLooka
e670: 73 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65  side;.    pParse
e680: 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20  ->nTab = n;.    
e690: 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20  if( pSelTab ){. 
e6a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
e6b0: 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ble->aCol==0 );.
e6c0: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
e6d0: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
e6e0: 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  ol;.      pTable
e6f0: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
e700: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
e710: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
e720: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
e730: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
e740: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
e750: 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
e760: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
e770: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
e780: 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61  xHeld(db, 0, pTa
e790: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  ble->pSchema) );
e7a0: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  .      pTable->p
e7b0: 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d  Schema->flags |=
e7c0: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
e7d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e7e0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
e7f0: 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
e800: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
e810: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
e820: 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20  (db, pSel);.  } 
e830: 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b  else {.    nErr+
e840: 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  +;.  }.#endif /*
e850: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
e860: 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
e870: 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
e880: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
e890: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
e8a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e8b0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
e8c0: 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
e8d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
e8e0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
e8f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
e900: 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
e910: 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
e920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
e930: 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
e940: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
e950: 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
e960: 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
e970: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
e980: 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
e990: 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
e9a0: 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
e9b0: 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
e9c0: 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
e9d0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
e9e0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
e9f0: 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
ea00: 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
ea10: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
ea20: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
ea30: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
ea40: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
ea50: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
ea60: 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
ea70: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
ea80: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61  pTab);.      pTa
ea90: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
eaa0: 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
eab0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  0;.    }.  }.  D
eac0: 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
ead0: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
eae0: 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
eaf0: 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
eb00: 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
eb10: 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
eb20: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
eb30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
eb40: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
eb50: 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
eb60: 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
eb70: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
eb80: 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
eb90: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
eba0: 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
ebb0: 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
ebc0: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
ebd0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
ebe0: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
ebf0: 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
ec00: 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
ec10: 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  .**.** Ticket #1
ec20: 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c  728:  The symbol
ec30: 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69   table might sti
ec40: 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72  ll contain infor
ec50: 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62  mation.** on tab
ec60: 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63  les and/or indic
ec70: 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20  es that are the 
ec80: 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
ec90: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20   deleted..** If 
eca0: 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c  you are unlucky,
ecb0: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65   one of those de
ecc0: 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72  leted indices or
ecd0: 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a   tables might.**
ece0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72   have the same r
ecf0: 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ootpage number a
ed00: 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65  s the real table
ed10: 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69   or index that i
ed20: 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64  s.** being moved
ed30: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
ed40: 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61  stop searching a
ed50: 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d  fter the first m
ed60: 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65  atch .** because
ed70: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
ed80: 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e   might be for on
ed90: 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64  e of the deleted
eda0: 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74   indices.** or t
edb0: 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68  ables and not th
edc0: 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68  e table/index th
edd0: 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62  at is actually b
ede0: 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57  eing moved..** W
edf0: 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20  e must continue 
ee00: 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c  looping until al
ee10: 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64  l tables and ind
ee20: 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f  ices with.** roo
ee30: 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76  tpage==iFrom hav
ee40: 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  e been converted
ee50: 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70   to have a rootp
ee60: 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e  age of iTo.** in
ee70: 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72   order to be cer
ee80: 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74  tain that we got
ee90: 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a   the right one..
eea0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
eeb0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
eec0: 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  M.void sqlite3Ro
eed0: 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69  otPageMoved(sqli
eee0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
eef0: 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
ef00: 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65   iTo){.  HashEle
ef10: 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
ef20: 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70   *pHash;.  Db *p
ef30: 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Db;..  assert( s
ef40: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
ef50: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
ef60: 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  ) );.  pDb = &db
ef70: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48  ->aDb[iDb];.  pH
ef80: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
ef90: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
efa0: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
efb0: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
efc0: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
efd0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
efe0: 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
eff0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
f000: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
f010: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
f020: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
f030: 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
f040: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  iTo;.    }.  }. 
f050: 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
f060: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
f070: 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
f080: 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
f090: 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
f0a0: 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
f0b0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
f0c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
f0d0: 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
f0e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
f0f0: 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
f100: 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d        pIdx->tnum
f110: 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
f120: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
f130: 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20  * Write code to 
f140: 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  erase the table 
f150: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
f160: 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62  Table from datab
f170: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f  ase iDb..** Also
f180: 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d   write code to m
f190: 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
f1a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
f1b0: 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
f1c0: 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70  a.** if a root-p
f1d0: 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74  age of another t
f1e0: 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
f1f0: 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72   the btree-layer
f200: 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69   whilst.** erasi
f210: 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20  ng iTable (this 
f220: 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
f230: 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
f240: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74  atabase)..*/ .st
f250: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
f260: 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20  yRootPage(Parse 
f270: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
f280: 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ble, int iDb){. 
f290: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
f2a0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
f2b0: 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  );.  int r1 = sq
f2c0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
f2d0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
f2e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f2f0: 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
f300: 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20  le, r1, iDb);.  
f310: 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
f320: 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
f330: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f340: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
f350: 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
f360: 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
f370: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
f380: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
f390: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
f3a0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
f3b0: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
f3c0: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
f3d0: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
f3e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
f3f0: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
f400: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f410: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
f420: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
f430: 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
f440: 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
f450: 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
f460: 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
f470: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
f480: 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
f490: 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
f4a0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
f4b0: 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
f4c0: 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
f4d0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
f4e0: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
f4f0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
f500: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
f510: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
f520: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
f530: 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
f540: 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
f550: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
f560: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
f570: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
f580: 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29   iTable, r1, r1)
f590: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
f5a0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f5b0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
f5c0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
f5d0: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
f5e0: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
f5f0: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
f600: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
f610: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
f620: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f630: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
f640: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
f650: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
f660: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
f670: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
f680: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
f690: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
f6a0: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
f6b0: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
f6c0: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
f6d0: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
f6e0: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
f6f0: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
f700: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
f710: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
f720: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
f730: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f740: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
f750: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f760: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f770: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f780: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65  ->pSchema);.  de
f790: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
f7a0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
f7b0: 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  , iDb);.  for(pI
f7c0: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f7d0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f7e0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
f7f0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
f800: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
f810: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  , iDb);.  }.#els
f820: 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
f830: 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
f840: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
f850: 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
f860: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
f870: 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
f880: 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
f890: 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
f8a0: 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
f8b0: 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
f8c0: 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
f8d0: 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
f8e0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
f8f0: 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
f900: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
f910: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
f920: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
f930: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
f940: 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
f950: 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
f960: 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
f970: 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
f980: 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
f990: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
f9a0: 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
f9b0: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
f9c0: 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
f9d0: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
f9e0: 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
f9f0: 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
fa00: 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
fa10: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
fa20: 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
fa30: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
fa40: 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
fa50: 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
fa60: 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
fa70: 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
fa80: 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
fa90: 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
faa0: 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
fab0: 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
fac0: 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
fad0: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
fae0: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
faf0: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
fb00: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
fb10: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
fb20: 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
fb30: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
fb40: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
fb50: 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
fb60: 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
fb70: 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
fb80: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
fb90: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
fba0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
fbb0: 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
fbc0: 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
fbd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fbe0: 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
fbf0: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
fc00: 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
fc10: 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
fc20: 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
fc30: 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
fc40: 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
fc50: 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
fc60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fc70: 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a   iLargest==0 ){.
fc80: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
fc90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
fca0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
fcb0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
fcc0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
fcd0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
fce0: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
fcf0: 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
fd00: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
fd10: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
fd20: 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
fd30: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
fd40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
fd50: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
fd60: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
fd70: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
fd80: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
fd90: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
fda0: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
fdb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fdc0: 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
fdd0: 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
fde0: 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
fdf0: 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
fe00: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
fe10: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
fe20: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
fe30: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
fe40: 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
fe50: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
fe60: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
fe70: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
fe80: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
fe90: 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
fea0: 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
feb0: 20 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20   );.  if( noErr 
fec0: 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
fed0: 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  r++;.  pTab = sq
fee0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
fef0: 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
ff00: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
ff20: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
ff30: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
ff40: 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 6e  tabase);.  if( n
ff50: 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
ff60: 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28  essErr--;..  if(
ff70: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
ff80: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
ff90: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20  able;.  }.  iDb 
ffa0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ffb0: 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
ffc0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73  >pSchema);.  ass
ffd0: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
ffe0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
fff0: 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61   /* If pTab is a
10000 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
10010 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75  call ViewGetColu
10020 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73  mnNames() to ens
10030 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69  ure.  ** it is i
10040 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
10050 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
10060 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
10070 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
10080 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
10090 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
100a0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
100b0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
100c0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
100d0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
100e0 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   code;.    const
100f0 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
10100 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
10110 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
10120 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
10130 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
10140 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32  onst char *zArg2
10150 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
10160 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
10170 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
10180 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
10190 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  Db)){.      goto
101a0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
101b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
101c0 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
101d0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
101e0 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
101f0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
10200 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49  ITE_DROP_TEMP_VI
10210 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
10220 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
10230 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57  SQLITE_DROP_VIEW
10240 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
10250 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10260 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d  RTUALTABLE.    }
10270 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75  else if( IsVirtu
10280 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
10290 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
102a0 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20  DROP_VTABLE;.   
102b0 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74     zArg2 = sqlit
102c0 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
102d0 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61  pTab)->pMod->zNa
102e0 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  me;.#endif.    }
102f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
10300 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
10310 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
10320 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
10330 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  DROP_TEMP_TABLE;
10340 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10350 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
10360 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a  ITE_DROP_TABLE;.
10370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10380 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
10390 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
103a0 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ode, pTab->zName
103b0 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b  , zArg2, zDb) ){
103c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
103d0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
103e0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
103f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
10400 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
10410 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  E, pTab->zName, 
10420 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
10430 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
10440 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  table;.    }.  }
10450 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
10460 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
10470 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
10480 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  te_", 7)==0 ){. 
10490 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
104a0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
104b0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
104c0 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
104d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
104e0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
104f0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
10500 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
10510 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
10520 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
10530 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
10540 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
10550 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
10560 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
10570 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
10580 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
10590 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
105a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
105b0 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
105c0 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
105d0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
105e0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
105f0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
10600 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
10610 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
10620 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10630 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
10640 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
10650 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
10660 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
10670 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
10680 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
10690 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
106a0 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
106b0 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
106c0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
106d0 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
106e0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
106f0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10700 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
10710 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
10720 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  er;.    Db *pDb 
10730 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
10740 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
10750 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
10760 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
10770 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10780 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10790 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  LE.    if( IsVir
107a0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
107b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
107c0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
107d0 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
107e0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44  f.    sqlite3FkD
107f0 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
10800 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 0a   pName, pTab);..
10810 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
10820 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
10830 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
10840 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
10850 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73  . Code.    ** is
10860 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
10870 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
10880 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
10890 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71  and/or.    ** sq
108a0 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
108b0 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
108c0 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65    */.    pTrigge
108d0 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
108e0 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
108f0 54 61 62 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  Tab);.    while(
10900 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
10910 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
10920 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
10930 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
10940 20 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67            pTrigg
10950 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
10960 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
10970 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10980 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
10990 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
109a0 3b 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72  ;.      pTrigger
109b0 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
109c0 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  xt;.    }..#ifnd
109d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
109e0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
109f0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
10a00 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
10a10 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
10a20 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
10a30 69 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  ith.    ** the t
10a40 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
10a50 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
10a60 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
10a70 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20  e is dropped.   
10a80 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
10a90 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
10aa0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
10ab0 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
10ac0 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61  to.    ** move a
10ad0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
10ae0 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
10af0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
10b00 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a  m mode)..    */.
10b10 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61      if( pTab->ta
10b20 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
10b30 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
10b40 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
10b50 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
10b60 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
10b70 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71  OM %s.sqlite_seq
10b80 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
10b90 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44  =%Q",.        pD
10ba0 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
10bb0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
10bc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
10bd0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
10be0 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
10bf0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
10c00 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
10c10 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c   the.    ** tabl
10c20 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
10c30 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
10c40 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
10c50 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
10c60 20 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20     ** every row 
10c70 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
10c80 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
10c90 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
10ca0 6e 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  ne being.    ** 
10cb0 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
10cc0 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
10cd0 70 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  perately because
10ce0 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
10cf0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
10d00 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
10d10 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
10d20 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
10d30 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  another.    ** d
10d40 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  atabase..    */.
10d50 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
10d60 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
10d70 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
10d80 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
10d90 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
10da0 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
10db0 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
10dc0 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
10dd0 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e  BLE(iDb), pTab->
10de0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
10df0 44 72 6f 70 20 61 6e 79 20 73 74 61 74 69 73 74  Drop any statist
10e00 69 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ics from the sql
10e10 69 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2c  ite_stat1 table,
10e20 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
10e30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10e40 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73  FindTable(db, "s
10e50 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62  qlite_stat1", db
10e60 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
10e70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10e80 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10e90 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44  arse,.        "D
10ea0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71  ELETE FROM %Q.sq
10eb0 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45  lite_stat1 WHERE
10ec0 20 74 62 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a   tbl=%Q", pDb->z
10ed0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
10ee0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
10ef0 0a 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65  ..    if( !isVie
10f00 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
10f10 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64  pTab) ){.      d
10f20 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
10f30 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  se, pTab);.    }
10f40 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
10f50 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
10f60 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
10f70 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
10f80 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20  d modify.    ** 
10f90 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
10fa0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
10fb0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
10fc0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10fd0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
10fe0 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
10ff0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
11000 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
11010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11020 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
11030 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c  able, iDb, 0, 0,
11040 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
11050 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
11060 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
11070 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71  , iDb);.  }.  sq
11080 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
11090 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74  (db, iDb);..exit
110a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73  _drop_table:.  s
110b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
110c0 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
110d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
110e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
110f0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
11100 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74  foreign key on t
11110 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72  he table.** curr
11120 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
11130 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d  truction.  pFrom
11140 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77  Col determines w
11150 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  hich columns.** 
11160 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
11170 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  able point to th
11180 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20  e foreign key.  
11190 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74  If pFromCol==0 t
111a0 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74  hen.** connect t
111b0 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61  he key to the la
111c0 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74  st column insert
111d0 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20  ed.  pTo is the 
111e0 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74  name of.** the t
111f0 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f  able referred to
11200 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c  .  pToCol is a l
11210 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ist of tables in
11220 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54   the other.** pT
11230 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65  o table that the
11240 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69   foreign key poi
11250 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63  nts to.  flags c
11260 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
11270 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
11280 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
11290 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
112a0 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
112b0 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
112c0 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
112d0 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
112e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
112f0 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
11300 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
11310 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
11320 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
11330 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
11340 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
11350 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a  wTable field..**
11360 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
11370 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
11380 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
11390 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
113a0 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
113b0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
113c0 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
113d0 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
113e0 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
113f0 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
11400 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
11410 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
11420 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
11430 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11440 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
11450 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
11460 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
11470 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
11480 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
11490 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
114a0 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
114b0 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
114c0 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
114d0 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
114e0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
114f0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
11500 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
11510 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
11520 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
11530 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
11540 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
11550 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
11560 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
11570 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46   *pFKey = 0;.  F
11580 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20  Key *pNextTo;.  
11590 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
115a0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
115b0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
115c0 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
115d0 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
115e0 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
115f0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
11600 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
11610 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
11620 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
11630 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
11640 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
11650 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
11660 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
11670 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
11680 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
11690 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
116a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
116b0 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
116c0 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
116d0 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
116e0 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
116f0 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
11700 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
11710 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
11720 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
11730 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
11740 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
11750 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
11760 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
11770 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
11780 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
11790 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
117a0 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
117b0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
117c0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
117d0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
117e0 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
117f0 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
11800 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
11810 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
11820 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
11830 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
11840 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
11850 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
11860 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
11870 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
11880 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
11890 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
118a0 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
118b0 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
118c0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
118d0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
118e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
118f0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
11900 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
11910 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
11920 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
11930 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
11940 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
11950 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11960 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
11970 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
11980 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
11990 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
119a0 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
119b0 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
119c0 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
119d0 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
119e0 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
119f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
11a00 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
11a10 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
11a20 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
11a30 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
11a40 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
11a50 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
11a60 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
11a70 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
11a80 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
11a90 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
11aa0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
11ab0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
11ac0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
11ad0 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
11ae0 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
11af0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
11b00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11b10 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
11b20 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
11b30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11b40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11b50 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
11b60 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
11b70 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11b80 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
11b90 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
11ba0 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
11bb0 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
11bc0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
11bd0 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
11be0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
11bf0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
11c00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
11c10 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
11c20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
11c30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
11c40 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
11c50 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
11c60 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
11c70 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
11c80 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
11c90 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
11ca0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
11cb0 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
11cc0 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
11cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
11ce0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
11cf0 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
11d00 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
11d10 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
11d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
11d30 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
11d40 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
11d50 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
11d60 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
11d70 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
11d80 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
11d90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
11da0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
11db0 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
11dc0 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
11dd0 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
11de0 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
11df0 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
11e00 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
11e10 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  zTo, sqlite3Strl
11e20 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29  en30(pFKey->zTo)
11e30 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a  , (void *)pFKey.
11e40 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74    );.  if( pNext
11e50 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20  To==pFKey ){.   
11e60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11e70 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  d = 1;.    goto 
11e80 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  fk_end;.  }.  if
11e90 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20  ( pNextTo ){.   
11ea0 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f   assert( pNextTo
11eb0 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a  ->pPrevTo==0 );.
11ec0 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74      pFKey->pNext
11ed0 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20  To = pNextTo;.  
11ee0 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76    pNextTo->pPrev
11ef0 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a  To = pFKey;.  }.
11f00 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66  .  /* Link the f
11f10 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68  oreign key to th
11f20 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c  e table as the l
11f30 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20  ast step..  */. 
11f40 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65   p->pFKey = pFKe
11f50 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a  y;.  pFKey = 0;.
11f60 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  .fk_end:.  sqlit
11f70 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b  e3DbFree(db, pFK
11f80 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21  ey);.#endif /* !
11f90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11fa0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29  MIT_FOREIGN_KEY)
11fb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
11fc0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
11fd0 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c  pFromCol);.  sql
11fe0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
11ff0 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a  te(db, pToCol);.
12000 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
12010 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
12020 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c  when an INITIALL
12030 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49  Y IMMEDIATE or I
12040 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
12050 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73  D.** clause is s
12060 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61  een as part of a
12070 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
12080 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73  inition.  The is
12090 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61  Deferred.** para
120a0 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49  meter is 1 for I
120b0 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
120c0 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54  D and 0 for INIT
120d0 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
120e0 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72  .** The behavior
120f0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
12100 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f  ently created fo
12110 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a  reign key is adj
12120 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69  usted.** accordi
12130 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ngly..*/.void sq
12140 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
12150 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72  nKey(Parse *pPar
12160 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72  se, int isDeferr
12170 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ed){.#ifndef SQL
12180 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
12190 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54  _KEY.  Table *pT
121a0 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  ab;.  FKey *pFKe
121b0 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d  y;.  if( (pTab =
121c0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
121d0 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79  le)==0 || (pFKey
121e0 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d   = pTab->pFKey)=
121f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
12200 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65  ssert( isDeferre
12210 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72  d==0 || isDeferr
12220 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20  ed==1 ); /* EV: 
12230 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f  R-30323-21917 */
12240 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
12250 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66  rred = (u8)isDef
12260 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a  erred;.#endif.}.
12270 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
12280 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
12290 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20  rase and refill 
122a0 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68  index *pIdx.  Th
122b0 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  is is.** used to
122c0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
122d0 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65  wly created inde
122e0 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74  x or to recomput
122f0 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e the.** content
12300 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20   of an index in 
12310 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45  response to a RE
12320 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
12330 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50  *.** if memRootP
12340 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74  age is not negat
12350 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ive, it means th
12360 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
12370 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64  newly.** created
12380 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20  .  The register 
12390 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d  specified by mem
123a0 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e  RootPage contain
123b0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
123c0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
123d0 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52   index.  If memR
123e0 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74  ootPage is negat
123f0 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ive, then.** the
12400 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
12410 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62  xists and must b
12420 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
12430 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20   being refilled 
12440 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20  and.** the root 
12450 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
12460 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65  he index is take
12470 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74  n from pIndex->t
12480 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  num..*/.static v
12490 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c  oid sqlite3Refil
124a0 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  lIndex(Parse *pP
124b0 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e  arse, Index *pIn
124c0 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74  dex, int memRoot
124d0 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Page){.  Table *
124e0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
124f0 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74  Table;  /* The t
12500 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64  able that is ind
12510 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  exed */.  int iT
12520 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
12530 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
12540 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
12550 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  r pTab */.  int 
12560 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iIdx = pParse->n
12570 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74  Tab++;     /* Bt
12580 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
12590 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20  for pIndex */.  
125a0 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
125c0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
125d0 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
125e0 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  t tnum;         
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12600 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64  Root page of ind
12610 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ex */.  Vdbe *v;
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
12640 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
12650 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
12660 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
12670 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
12680 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
12690 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
126a0 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20 20  int regIdxKey;  
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
126c0 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e 74  * Registers cont
126d0 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
126e0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72 65   key */.  int re
126f0 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
12700 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
12710 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73  ster holding ass
12720 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65  emblied index re
12730 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
12740 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
12750 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
12760 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12770 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
12780 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
12790 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
127a0 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
127b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
127c0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
127d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
127e0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
127f0 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
12800 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
12810 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
12820 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
12830 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
12840 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
12850 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
12860 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
12870 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
12880 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
12890 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
128a0 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
128b0 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
128c0 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
128d0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
128e0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
128f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
12900 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
12910 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
12920 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
12930 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
12940 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
12950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12960 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
12970 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
12980 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
12990 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
129a0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
129b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
129c0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
129d0 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
129e0 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20   iDb, .         
129f0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
12a00 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49   *)pKey, P4_KEYI
12a10 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
12a20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
12a30 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12a40 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12a50 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   1);.  }.  sqlit
12a60 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
12a70 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
12a80 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
12a90 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
12aa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12ab0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
12ac0 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f  b, 0);.  regReco
12ad0 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
12ae0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
12af0 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73 71    regIdxKey = sq
12b00 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
12b10 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
12b20 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52  ndex, iTab, regR
12b30 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66 28  ecord, 1);.  if(
12b40 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
12b50 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20  !=OE_None ){.   
12b60 20 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52 6f   const int regRo
12b70 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79 20  wid = regIdxKey 
12b80 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  + pIndex->nColum
12b90 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  n;.    const int
12ba0 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
12bb0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
12bc0 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a 20  + 2;.    void * 
12bd0 63 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d 20  const pRegKey = 
12be0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
12bf0 52 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a 20  R(regIdxKey);.. 
12c00 20 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73 74     /* The regist
12c10 65 72 73 20 61 63 63 65 73 73 65 64 20 62 79 20  ers accessed by 
12c20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
12c30 6f 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c 6f  opcode were allo
12c40 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73 69  cated.    ** usi
12c50 6e 67 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  ng sqlite3GetTem
12c60 70 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65 20  pRange() inside 
12c70 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 47 65  of the sqlite3Ge
12c80 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 29  nerateIndexKey()
12c90 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
12ca0 76 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65 20  ve. Just before 
12cb0 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77 61  that function wa
12cc0 73 20 66 72 65 65 64 20 74 68 65 79 20 77 65 72  s freed they wer
12cd0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
12ce0 2a 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62 6c  * (made availabl
12cf0 65 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65  e to the compile
12d00 72 20 66 6f 72 20 72 65 75 73 65 29 20 75 73 69  r for reuse) usi
12d10 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  ng .    ** sqlit
12d20 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
12d30 67 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d 65  ge(). So in some
12d40 20 77 61 79 73 20 68 61 76 69 6e 67 20 74 68 65   ways having the
12d50 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20 20   OP_IsUnique.   
12d60 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20 74   ** opcode use t
12d70 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
12d80 20 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64 61   within seems da
12d90 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65 72  ngerous. However
12da0 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 77  , since.    ** w
12db0 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  e can be sure th
12dc0 61 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d 70  at no other temp
12dd0 20 72 65 67 69 73 74 65 72 73 20 68 61 76 65 20   registers have 
12de0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 20  been allocated. 
12df0 20 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c 69     ** since sqli
12e00 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
12e10 6e 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  nge() was called
12e20 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  , it is safe to 
12e30 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  do so..    */.  
12e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e50 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  Op4(v, OP_IsUniq
12e60 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72 65  ue, iIdx, j2, re
12e70 67 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79 2c  gRowid, pRegKey,
12e80 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
12e90 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
12ea0 72 61 69 6e 74 28 0a 20 20 20 20 20 20 20 20 70  raint(.        p
12eb0 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c  Parse, OE_Abort,
12ec0 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e   "indexed column
12ed0 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65  s are not unique
12ee0 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ", P4_STATIC);. 
12ef0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
12f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
12f10 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65  Insert, iIdx, re
12f20 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
12f30 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12f40 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
12f50 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
12f60 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12f70 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
12f80 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
12f90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12fa0 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
12fb0 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  1+1);.  sqlite3V
12fc0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
12fd0 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr1);.  sqlite3
12fe0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12ff0 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20  _Close, iTab);. 
13000 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13010 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
13020 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iIdx);.}../*.** 
13030 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
13040 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
13050 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
13060 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
13070 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
13080 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
13090 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
130a0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
130b0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
130c0 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
130d0 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
130e0 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
130f0 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
13100 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
13110 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
13120 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
13130 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
13140 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
13150 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
13160 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
13170 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
13180 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
13190 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
131a0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
131b0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
131c0 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
131d0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
131e0 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
131f0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
13200 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
13210 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
13220 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
13230 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
13240 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
13250 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
13260 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
13270 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
13280 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
13290 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
132a0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69   .**.** If the i
132b0 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
132c0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65  successfully, re
132d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
132e0 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a  o the new Index.
132f0 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ** structure. Th
13300 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71  is is used by sq
13310 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
13320 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65  ey() to mark the
13330 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65   index.** as the
13340 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20   tables primary 
13350 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49  key (Index.autoI
13360 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64  ndex==2)..*/.Ind
13370 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  ex *sqlite3Creat
13380 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
13390 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
133a0 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
133b0 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
133c0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
133d0 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
133e0 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
133f0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
13400 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
13410 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
13420 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
13430 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
13440 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
13450 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
13460 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
13470 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
13480 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
13490 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
134a0 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
134b0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
134c0 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
134d0 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
134e0 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
134f0 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
13500 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
13510 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
13520 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
13530 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
13540 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
13550 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
13560 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  End,       /* Th
13570 65 20 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65  e ")" that close
13580 73 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  s the CREATE IND
13590 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
135a0 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
135b0 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
135c0 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
135d0 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
135e0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
135f0 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d  tExist     /* Om
13600 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
13610 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
13620 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
13630 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pRet = 0;     /*
13640 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75   Pointer to retu
13650 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rn */.  Table *p
13660 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
13670 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
13680 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
13690 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
136a0 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
136b0 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
136c0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
136d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
136e0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
136f0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
13700 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
13710 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
13720 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
13730 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64  ;.  Token nullId
13740 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65  ;        /* Fake
13750 20 74 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d   token for an em
13760 70 74 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20  pty ID list */. 
13770 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
13780 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
13790 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
137a0 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
137b0 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
137c0 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
137d0 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
137e0 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
137f0 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
13800 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13810 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
13820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13830 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
13840 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
13850 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
13860 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
13870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13880 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
13890 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
138a0 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
138b0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
138c0 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
138d0 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
138e0 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
138f0 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
13900 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
13910 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
13920 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
13930 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  /.  int nCol;.  
13940 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
13950 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
13960 0a 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72  .  assert( pStar
13970 74 3d 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20  t==0 || pEnd!=0 
13980 29 3b 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74 20  ); /* pEnd must 
13990 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70  be non-NULL if p
139a0 53 74 61 72 74 20 69 73 20 2a 2f 0a 20 20 61 73  Start is */.  as
139b0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
139c0 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  rr==0 );      /*
139d0 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
139e0 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
139f0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
13a00 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f  locFailed || IN_
13a10 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
13a20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13a30 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
13a40 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
13a50 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
13a60 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
13a70 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13a80 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20  te_index;.  }.. 
13a90 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
13aa0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
13ab0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
13ac0 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20  Return early if 
13ad0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
13ae0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
13af0 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65  0 ){..    /* Use
13b00 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e   the two-part in
13b10 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  dex name to dete
13b20 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61  rmine the databa
13b30 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65  se .    ** to se
13b40 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62  arch for the tab
13b50 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61  le. 'Fix' the ta
13b60 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73  ble name to this
13b70 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72   db.    ** befor
13b80 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65  e looking up the
13b90 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
13ba0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
13bb0 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20  1 && pName2 );. 
13bc0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
13bd0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
13be0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
13bf0 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20  e2, &pName);.   
13c00 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74   if( iDb<0 ) got
13c10 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13c20 64 65 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  dex;..#ifndef SQ
13c30 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
13c40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
13c50 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
13c60 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
13c70 20 69 66 20 74 68 65 20 74 68 65 20 74 61 62 6c   if the the tabl
13c80 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65  e.    ** is a te
13c90 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c  mp table. If so,
13ca0 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
13cb0 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64  e to 1. Do not d
13cc0 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66  o this.    ** if
13cd0 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20   initialising a 
13ce0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
13cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13d00 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
13d10 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73  {.      pTab = s
13d20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f  qlite3SrcListLoo
13d30 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c  kup(pParse, pTbl
13d40 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
13d50 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
13d60 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70   pTab && pTab->p
13d70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
13d80 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
13d90 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
13da0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
13db0 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  dif..    if( sql
13dc0 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
13dd0 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
13de0 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
13df0 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
13e00 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
13e10 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
13e20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65    ){.      /* Be
13e30 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
13e40 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
13e50 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
13e60 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
13e70 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
13e80 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
13e90 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
13ea0 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
13eb0 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
13ec0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
13ed0 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62  e(pParse, 0, pTb
13ee0 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
13ef0 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
13f00 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13f10 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
13f20 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  pTab || db->mall
13f30 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
13f40 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13f50 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  x;.    assert( d
13f60 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
13f70 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
13f80 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ma );.  }else{. 
13f90 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
13fa0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
13fb0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
13fc0 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54  ble;.    if( !pT
13fd0 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) goto exit_c
13fe0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13ff0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
14000 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
14010 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
14020 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d    }.  pDb = &db-
14030 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73  >aDb[iDb];..  as
14040 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
14050 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
14060 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
14070 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
14080 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
14090 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
140a0 30 20 0a 20 20 20 20 20 20 20 26 26 20 6d 65 6d  0 .       && mem
140b0 63 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  cmp(&pTab->zName
140c0 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
140d0 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
140e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
140f0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
14100 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
14110 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
14120 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
14130 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14140 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14150 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
14160 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
14170 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14180 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
14190 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
141a0 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
141b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
141c0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
141d0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
141e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
141f0 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
14200 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
14210 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14220 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
14230 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
14240 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
14250 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14260 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
14270 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
14280 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
14290 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
142a0 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
142b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
142c0 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
142d0 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
142e0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
142f0 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
14300 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
14310 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
14320 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
14330 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
14340 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
14350 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
14360 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
14370 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
14380 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
14390 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
143a0 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
143b0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
143c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
143d0 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
143e0 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
143f0 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
14400 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
14410 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
14420 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
14430 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
14440 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
14450 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
14460 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
14470 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
14480 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
14490 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
144a0 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
144b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
144c0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
144d0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
144e0 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
144f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14500 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
14510 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
14520 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
14530 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
14540 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14550 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14560 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
14570 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
14580 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
14590 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
145a0 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
145b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
145c0 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
145d0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74  e is already a t
145e0 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20  able named %s", 
145f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
14600 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
14610 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
14620 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
14630 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
14640 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
14650 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
14660 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73    if( !ifNotExis
14670 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
14680 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14690 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
146a0 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
146b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
146c0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
146d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
146e0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
146f0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
14700 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
14710 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
14720 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
14730 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
14740 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
14750 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
14760 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
14770 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
14780 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
14790 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
147a0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
147b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
147c0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
147d0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
147e0 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
147f0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
14800 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
14810 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14820 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
14830 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14840 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65  zDb = pDb->zName
14850 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14860 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14870 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
14880 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
14890 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Db), 0, zDb) ){.
148a0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
148b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
148c0 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49    }.    i = SQLI
148d0 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b  TE_CREATE_INDEX;
148e0 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
148f0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
14900 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ) i = SQLITE_CRE
14910 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ATE_TEMP_INDEX;.
14920 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
14930 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
14940 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d   i, zName, pTab-
14950 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
14960 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14970 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14980 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14990 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30    /* If pList==0
149a0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  , it means this 
149b0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
149c0 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69  ed to make a pri
149d0 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75  mary.  ** key ou
149e0 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f  t of the last co
149f0 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68  lumn added to th
14a00 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
14a10 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a  nstruction..  **
14a20 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b   So create a fak
14a30 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61  e list to simula
14a40 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  te this..  */.  
14a50 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
14a60 20 20 20 20 6e 75 6c 6c 49 64 2e 7a 20 3d 20 70      nullId.z = p
14a70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
14a80 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
14a90 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71     nullId.n = sq
14aa0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28 63  lite3Strlen30((c
14ab0 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  har*)nullId.z);.
14ac0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
14ad0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
14ae0 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  d(pParse, 0, 0);
14af0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
14b00 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
14b10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14b20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
14b30 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
14b40 4c 69 73 74 2c 20 26 6e 75 6c 6c 49 64 2c 20 30  List, &nullId, 0
14b50 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  );.    pList->a[
14b60 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28  0].sortOrder = (
14b70 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  u8)sortOrder;.  
14b80 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
14b90 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
14ba0 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72  s of space are r
14bb0 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
14bc0 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a   explicitly.  **
14bd0 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
14be0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
14bf0 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mes..  */.  for(
14c00 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
14c10 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
14c20 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
14c30 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
14c40 20 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b      if( pExpr ){
14c50 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
14c60 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70  pColl = pExpr->p
14c70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 2f 2a 20 45  Coll;.      /* E
14c80 69 74 68 65 72 20 70 43 6f 6c 6c 21 3d 30 20 6f  ither pColl!=0 o
14c90 72 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 4f  r there was an O
14ca0 4f 4d 20 66 61 69 6c 75 72 65 2e 20 20 42 75 74  OM failure.  But
14cb0 20 69 66 20 61 6e 20 4f 4f 4d 0a 20 20 20 20 20   if an OOM.     
14cc0 20 2a 2a 20 66 61 69 6c 75 72 65 20 77 65 20 68   ** failure we h
14cd0 61 76 65 20 71 75 69 74 20 62 65 66 6f 72 65 20  ave quit before 
14ce0 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f  reaching this po
14cf0 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  int. */.      if
14d00 28 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c 29 20  ( ALWAYS(pColl) 
14d10 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 78 74 72  ){.        nExtr
14d20 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65  a += (1 + sqlite
14d30 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d  3Strlen30(pColl-
14d40 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
14d50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
14d60 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
14d70 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
14d80 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
14d90 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
14da0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
14db0 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nCol = pList->nE
14dc0 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  xpr;.  pIndex = 
14dd0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
14de0 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73  ero(db, .      s
14df0 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20  izeof(Index) +  
14e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14e10 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
14e20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14e30 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  int)*nCol +     
14e40 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
14e50 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20  iColumn   */.   
14e60 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28     sizeof(int)*(
14e70 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20  nCol+1) +       
14e80 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  /* Index.aiRowEs
14e90 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  t   */.      siz
14ea0 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c  eof(char *)*nCol
14eb0 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64   +        /* Ind
14ec0 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
14ed0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38  .      sizeof(u8
14ee0 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
14ef0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
14f00 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  rtOrder */.     
14f10 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20   nName + 1 +    
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14f30 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20   Index.zName    
14f40 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72    */.      nExtr
14f50 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a               
14f60 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
14f70 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
14f80 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  mes */.  );.  if
14f90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14fa0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
14fb0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14fc0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e  ;.  }.  pIndex->
14fd0 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a  azColl = (char**
14fe0 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20  )(&pIndex[1]);. 
14ff0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
15000 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e  n = (int *)(&pIn
15010 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c  dex->azColl[nCol
15020 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ]);.  pIndex->ai
15030 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
15040 65 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  ed *)(&pIndex->a
15050 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a  iColumn[nCol]);.
15060 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
15070 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70  rder = (u8 *)(&p
15080 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b  Index->aiRowEst[
15090 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64  nCol+1]);.  pInd
150a0 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  ex->zName = (cha
150b0 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53  r *)(&pIndex->aS
150c0 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b  ortOrder[nCol]);
150d0 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61  .  zExtra = (cha
150e0 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e  r *)(&pIndex->zN
150f0 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20  ame[nName+1]);. 
15100 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e   memcpy(pIndex->
15110 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
15120 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78  ame+1);.  pIndex
15130 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
15140 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  .  pIndex->nColu
15150 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  mn = pList->nExp
15160 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  r;.  pIndex->onE
15170 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72  rror = (u8)onErr
15180 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  or;.  pIndex->au
15190 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70  toIndex = (u8)(p
151a0 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64  Name==0);.  pInd
151b0 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ex->pSchema = db
151c0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
151d0 6d 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ma;.  assert( sq
151e0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
151f0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
15200 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
15210 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
15220 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
15230 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
15240 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
15250 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
15260 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
15270 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
15280 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
15290 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
152a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
152b0 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
152c0 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
152d0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63   */.  }..  /* Sc
152e0 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
152f0 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
15300 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
15310 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
15320 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
15330 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
15340 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
15350 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
15360 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
15370 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
15380 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  nd..  **.  ** TO
15390 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20  DO:  Add a test 
153a0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
153b0 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  t the same colum
153c0 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20  n is not named. 
153d0 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   ** more than on
153e0 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ce within the sa
153f0 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  me index.  Only 
15400 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  the first instan
15410 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63  ce of.  ** the c
15420 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20  olumn will ever 
15430 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  be used by the o
15440 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20  ptimizer.  Note 
15450 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20  that using the. 
15460 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20   ** same column 
15470 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63  more than once c
15480 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f  annot be an erro
15490 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  r because that w
154a0 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b  ould .  ** break
154b0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
154c0 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65  tibility - it ne
154d0 65 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e  eds to be a warn
154e0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
154f0 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70  i=0, pListItem=p
15500 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
15510 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c  ->nExpr; i++, pL
15520 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
15530 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
15540 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d  Name = pListItem
15550 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  ->zName;.    Col
15560 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
15570 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
15580 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68  ortOrder;.    ch
15590 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
155b0 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
155c0 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  ce name */..    
155d0 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c  for(j=0, pTabCol
155e0 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
155f0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
15600 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
15610 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
15620 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70  ICmp(zColName, p
15630 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d  TabCol->zName)==
15640 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
15650 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62  .    if( j>=pTab
15660 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
15670 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15680 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
15690 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  s has no column 
156a0 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20  named %s",.     
156b0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
156c0 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zColName);.     
156d0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
156e0 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
156f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
15700 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
15710 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
15720 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 2f  mn[i] = j;.    /
15730 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
15740 6f 66 20 74 68 65 20 41 4c 57 41 59 53 28 70 4c  of the ALWAYS(pL
15750 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
15760 70 43 6f 6c 6c 29 3a 20 20 42 65 63 61 75 73 65  pColl):  Because
15770 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 77   of.    ** the w
15780 61 79 20 74 68 65 20 22 69 64 78 6c 69 73 74 22  ay the "idxlist"
15790 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 69 73   non-terminal is
157a0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
157b0 74 68 65 20 70 61 72 73 65 72 2c 0a 20 20 20 20  the parser,.    
157c0 2a 2a 20 69 66 20 70 4c 69 73 74 49 74 65 6d 2d  ** if pListItem-
157d0 3e 70 45 78 70 72 20 69 73 20 6e 6f 74 20 6e 75  >pExpr is not nu
157e0 6c 6c 20 74 68 65 6e 20 65 69 74 68 65 72 20 70  ll then either p
157f0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
15800 3e 70 43 6f 6c 6c 0a 20 20 20 20 2a 2a 20 6d 75  >pColl.    ** mu
15810 73 74 20 65 78 69 73 74 20 6f 72 20 65 6c 73 65  st exist or else
15820 20 74 68 65 72 65 20 6d 75 73 74 20 68 61 76 65   there must have
15830 20 62 65 65 6e 20 61 6e 20 4f 4f 4d 20 65 72 72   been an OOM err
15840 6f 72 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  or.  But if ther
15850 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 61 6e 20  e.    ** was an 
15860 4f 4f 4d 20 65 72 72 6f 72 2c 20 77 65 20 77 6f  OOM error, we wo
15870 75 6c 64 20 6e 65 76 65 72 20 72 65 61 63 68 20  uld never reach 
15880 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20  this point. */. 
15890 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
158a0 2d 3e 70 45 78 70 72 20 26 26 20 41 4c 57 41 59  ->pExpr && ALWAY
158b0 53 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  S(pListItem->pEx
158c0 70 72 2d 3e 70 43 6f 6c 6c 29 20 29 7b 0a 20 20  pr->pColl) ){.  
158d0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20      int nColl;. 
158e0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69       zColl = pLi
158f0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
15900 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
15910 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     nColl = sqlit
15920 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
15930 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) + 1;.      ass
15940 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f  ert( nExtra>=nCo
15950 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ll );.      memc
15960 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c  py(zExtra, zColl
15970 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , nColl);.      
15980 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
15990 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
159a0 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78  nColl;.      nEx
159b0 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra -= nColl;.  
159c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
159d0 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
159e0 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
159f0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a    if( !zColl ){.
15a00 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20          zColl = 
15a10 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a  db->pDfltColl->z
15a20 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
15a30 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
15a40 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
15a50 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
15a60 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
15a70 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  l) ){.      goto
15a80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15a90 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
15aa0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
15ab0 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
15ac0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
15ad0 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
15ae0 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
15af0 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
15b00 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
15b10 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65  ] = (u8)requeste
15b20 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  dSortOrder;.  }.
15b30 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
15b40 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
15b50 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
15b60 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
15b70 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
15b80 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
15b90 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
15ba0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
15bb0 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
15bc0 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
15bd0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
15be0 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
15bf0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
15c00 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
15c10 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
15c20 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
15c30 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
15c40 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
15c50 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
15c60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
15c70 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
15c80 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
15c90 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
15ca0 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
15cb0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
15cc0 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
15cd0 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
15ce0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
15cf0 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
15d00 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
15d10 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
15d20 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
15d30 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
15d40 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
15d50 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
15d60 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
15d70 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
15d80 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
15d90 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
15da0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
15db0 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51  .    ** Two UNIQ
15dc0 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
15dd0 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  Y constraints ar
15de0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
15df0 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28  ivalent.    ** (
15e00 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73  and thus suppres
15e10 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20  sing the second 
15e20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65  one) even if the
15e30 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  y have different
15e40 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64  .    ** sort ord
15e50 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ers..    **.    
15e60 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
15e70 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74  different collat
15e80 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72  ing sequences or
15e90 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   if the columns 
15ea0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
15eb0 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69  nstraint occur i
15ec0 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  n different orde
15ed0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  rs, then the con
15ee0 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20  straints are.   
15ef0 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64   ** considered d
15f00 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68  istinct and both
15f10 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72   result in separ
15f20 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  ate indices..   
15f30 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
15f40 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
15f50 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
15f60 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
15f70 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
15f80 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
15f90 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
15fa0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
15fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
15fc0 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
15fd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
15fe0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
15ff0 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
16000 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  if( pIdx->nColum
16010 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  n!=pIndex->nColu
16020 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  mn ) continue;. 
16030 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
16040 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  pIdx->nColumn; k
16050 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
16060 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20  st char *z1;.   
16070 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
16080 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28  *z2;.        if(
16090 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
160a0 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
160b0 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
160c0 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49  .        z1 = pI
160d0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
160e0 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64         z2 = pInd
160f0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
16100 20 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a         if( z1!=z
16110 32 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  2 && sqlite3StrI
16120 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72  Cmp(z1, z2) ) br
16130 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16140 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e     if( k==pIdx->
16150 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
16160 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
16170 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e  rror!=pIndex->on
16180 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
16190 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74     /* This const
161a0 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68  raint creates th
161b0 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20  e same index as 
161c0 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
161d0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
161e0 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d  nt specified som
161f0 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52  ewhere in the CR
16200 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
16210 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ment..          
16220 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f  ** However the O
16230 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
16240 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
16250 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a  . If both this .
16260 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
16270 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20  straint and the 
16280 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c  previous equival
16290 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  ent constraint h
162a0 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20  ave explicit.   
162b0 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e         ** ON CON
162c0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68  FLICT clauses th
162d0 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  is is an error. 
162e0 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
162f0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
16300 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
16310 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20 66  fied behaviour f
16320 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
16330 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16340 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
16350 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
16360 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
16370 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
16380 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
16390 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
163a0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
163c0 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
163d0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
163e0 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
163f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16400 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
16410 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
16420 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
16430 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
16440 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
16450 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
16460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16470 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
16480 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
16490 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
164a0 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
164b0 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
164c0 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
164d0 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
164e0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
164f0 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
16500 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
16510 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
16520 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73  Index *p;.    as
16530 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
16540 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
16550 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
16560 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  ema) );.    p = 
16570 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
16580 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
16590 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
165c0 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
165d0 72 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a  rlen30(pIndex->z
165e0 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16600 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66   pIndex);.    if
16610 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( p ){.      ass
16620 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
16630 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
16640 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
16650 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
16660 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
16670 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
16680 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
16690 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  .    db->flags |
166a0 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
166b0 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20  hanges;.    if( 
166c0 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
166d0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75       pIndex->tnu
166e0 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
166f0 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tnum;.    }.  }.
16700 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
16710 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
16720 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20  then create the 
16730 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20  index on disk.  
16740 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76  This.  ** involv
16750 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69  es writing the i
16760 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61  ndex into the ma
16770 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66  ster table and f
16780 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20  illing in the.  
16790 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68  ** index with th
167a0 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
167b0 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20  contents..  **. 
167c0 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74   ** The db->init
167d0 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20  .busy is 0 when 
167e0 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65  the user first e
167f0 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49  nters a CREATE I
16800 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61  NDEX .  ** comma
16810 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75  nd.  db->init.bu
16820 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64  sy is 1 when a d
16830 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
16840 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41  d and .  ** CREA
16850 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
16860 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74  nts are read out
16870 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74   of the master t
16880 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74  able.  In.  ** t
16890 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74  he latter case t
168a0 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
168b0 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
168c0 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20   which is why.  
168d0 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
168e0 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e   to recreate it.
168f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54  .  **.  ** If pT
16900 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61  blName==0 it mea
16910 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  ns this index is
16920 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20   generated as a 
16930 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a  primary key.  **
16940 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
16950 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54  raint of a CREAT
16960 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
16970 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
16980 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
16990 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
169a0 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
169b0 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
169c0 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
169d0 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
169e0 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
169f0 20 20 65 6c 73 65 7b 20 2f 2a 20 69 66 28 20 64    else{ /* if( d
16a00 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
16a10 29 20 2a 2f 0a 20 20 20 20 56 64 62 65 20 2a 76  ) */.    Vdbe *v
16a20 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  ;.    char *zStm
16a30 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20  t;.    int iMem 
16a40 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
16a50 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  ;..    v = sqlit
16a60 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
16a70 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
16a80 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
16a90 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20  te_index;...    
16aa0 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f  /* Create the ro
16ab0 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69  otpage for the i
16ac0 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
16ad0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
16ae0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
16af0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
16b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16b10 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  2(v, OP_CreateIn
16b20 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b  dex, iDb, iMem);
16b30 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
16b40 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
16b50 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
16b60 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
16b70 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
16b80 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
16b90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
16ba0 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 61 73  tart ){.      as
16bb0 73 65 72 74 28 20 70 45 6e 64 21 3d 30 20 29 3b  sert( pEnd!=0 );
16bc0 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65  .      /* A name
16bd0 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20  d index with an 
16be0 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20  explicit CREATE 
16bf0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
16c00 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
16c10 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
16c20 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e  db, "CREATE%s IN
16c30 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20  DEX %.*s",.     
16c40 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e     onError==OE_N
16c50 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49  one ? "" : " UNI
16c60 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70 45  QUE",.        pE
16c70 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  nd->z - pName->z
16c80 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70 4e   + 1,.        pN
16c90 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
16ca0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
16cb0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
16cc0 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
16cd0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
16ce0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
16cf0 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
16d00 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
16d10 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
16d20 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
16d30 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
16d40 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
16d50 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
16d60 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
16d70 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
16d80 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
16d90 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
16da0 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
16db0 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
16dc0 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
16dd0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
16de0 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
16df0 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
16e00 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
16e10 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
16e20 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
16e30 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
16e40 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
16e50 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
16e60 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
16e70 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
16e80 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
16e90 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
16ea0 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
16eb0 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
16ec0 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
16ed0 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
16ee0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
16ef0 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
16f00 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
16f10 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
16f20 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
16f30 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
16f40 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
16f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16f60 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16f70 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
16f80 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  b, 0, 0,.       
16f90 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
16fa0 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20  (db, "name='%q' 
16fb0 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
16fc0 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
16fd0 29 2c 20 0a 20 20 20 20 20 20 20 20 20 50 34 5f  ), .         P4_
16fe0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
16ff0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17000 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
17010 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
17020 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
17030 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
17040 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
17050 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
17060 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
17070 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
17080 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
17090 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
170a0 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
170b0 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
170c0 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
170d0 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
170e0 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
170f0 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
17100 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
17110 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
17120 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
17130 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
17140 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
17150 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
17160 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
17170 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
17180 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
17190 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
171a0 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
171b0 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
171c0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
171d0 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
171e0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
171f0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
17200 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
17210 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
17220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
17230 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
17240 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
17250 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
17260 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
17270 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
17280 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
17290 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
172a0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
172b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
172c0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
172d0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
172e0 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
172f0 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
17300 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e  }.    pRet = pIn
17310 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
17320 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
17330 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
17340 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
17350 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
17360 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
17370 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17380 62 2c 20 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  b, pIndex->zColA
17390 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ff);.    sqlite3
173a0 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64 65  DbFree(db, pInde
173b0 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
173c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
173d0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
173e0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
173f0 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
17400 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
17410 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
17420 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
17430 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
17440 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
17450 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
17460 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
17470 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
17480 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
17490 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
174a0 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
174b0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
174c0 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
174d0 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
174e0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
174f0 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
17500 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
17510 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
17520 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
17530 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
17540 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
17550 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
17560 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
17570 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
17580 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
17590 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
175a0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
175b0 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
175c0 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
175d0 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
175e0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
175f0 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
17600 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f  r combiniation o
17610 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
17620 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
17630 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
17640 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
17650 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
17660 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
17670 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
17680 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
17690 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
176a0 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
176b0 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
176c0 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
176d0 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
176e0 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
176f0 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
17700 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
17710 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
17720 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
17730 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
17740 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
17750 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
17760 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
17770 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17780 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
17790 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
177a0 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78  signed *a = pIdx
177b0 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e  ->aiRowEst;.  in
177c0 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
177d0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d  n;.  assert( a!=
177e0 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 49  0 );.  a[0] = pI
177f0 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
17800 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c  Est;.  if( a[0]<
17810 31 30 20 29 20 61 5b 30 5d 20 3d 20 31 30 3b 0a  10 ) a[0] = 10;.
17820 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28    n = 10;.  for(
17830 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 43  i=1; i<=pIdx->nC
17840 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
17850 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20 20 69   a[i] = n;.    i
17860 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20 20  f( n>5 ) n--;.  
17870 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
17880 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
17890 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43  {.    a[pIdx->nC
178a0 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a  olumn] = 1;.  }.
178b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
178c0 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
178d0 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
178e0 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
178f0 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
17900 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
17910 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
17920 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
17930 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
17940 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
17950 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
17960 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
17970 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
17980 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
17990 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
179a0 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65  int iDb;..  asse
179b0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
179c0 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65  ==0 );   /* Neve
179d0 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
179e0 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
179f0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
17a00 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
17a10 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
17a20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17a30 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
17a40 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
17a50 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
17a60 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
17a70 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17a80 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
17a90 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
17aa0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
17ab0 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
17ac0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
17ad0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
17ae0 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
17af0 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
17b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
17b10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17b20 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
17b30 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
17b40 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
17b50 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
17b60 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17b70 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
17b80 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
17b90 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
17ba0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17bb0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
17bc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
17bd0 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
17be0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
17bf0 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
17c00 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
17c10 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
17c20 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
17c30 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
17c40 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
17c50 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
17c60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17c70 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
17c80 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
17c90 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
17ca0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
17cb0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
17cc0 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
17cd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
17ce0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
17cf0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
17d00 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
17d10 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
17d20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
17d30 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17d40 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
17d50 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
17d60 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17d70 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
17d80 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
17d90 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
17da0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
17db0 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
17dc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
17dd0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17de0 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
17df0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
17e00 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
17e10 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
17e20 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
17e30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
17e40 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
17e50 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
17e60 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
17e70 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
17e80 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
17e90 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
17ea0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
17eb0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
17ec0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
17ed0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
17ee0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
17ef0 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
17f00 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
17f10 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
17f20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
17f30 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
17f40 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
17f50 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
17f60 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
17f70 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
17f80 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
17f90 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  e(db, "sqlite_st
17fa0 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44  at1", db->aDb[iD
17fb0 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  b].zName) ){.   
17fc0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
17fd0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
17fe0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
17ff0 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74 61  OM %Q.sqlite_sta
18000 74 31 20 57 48 45 52 45 20 69 64 78 3d 25 51 22  t1 WHERE idx=%Q"
18010 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ,.        db->aD
18020 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70 49  b[iDb].zName, pI
18030 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
18040 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
18050 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
18060 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
18070 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
18080 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
18090 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
180a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
180b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
180c0 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
180d0 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
180e0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
180f0 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
18100 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
18110 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
18120 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69  ../*.** pArray i
18130 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
18140 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  n array of objec
18150 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63 74  ts.  Each object
18160 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
18170 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
18180 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69 73  s in size.  This
18190 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74   routine allocat
181a0 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65  es a new.** obje
181b0 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ct on the end of
181c0 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a   the array..**.*
181d0 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74 68  * *pnEntry is th
181e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
181f0 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75  ies already in u
18200 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69 73  se.  *pnAlloc is
18210 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73  .** the previous
18220 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a  ly allocated siz
18230 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 20  e of the array. 
18240 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68 65   initSize is the
18250 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69 6e  .** suggested in
18260 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a 65  itial array size
18270 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a   allocation..**.
18280 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  ** The index of 
18290 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
182a0 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70 49   returned in *pI
182b0 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  dx..**.** This r
182c0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
182d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
182e0 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
182f0 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68 74  .  This.** might
18300 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
18310 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61 6d  the pArray param
18320 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68 74  eter or it might
18330 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74 0a   be a different.
18340 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74 68  ** pointer if th
18350 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73 69  e array was resi
18360 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  zed..*/.void *sq
18370 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
18380 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
18390 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
183a0 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
183b0 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
183c0 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
183d0 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
183e0 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
183f0 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
18400 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
18410 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
18420 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
18430 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
18440 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69 7a  */.  int initSiz
18450 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65 73  e,     /* Sugges
18460 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f  ted initial allo
18470 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65  cation, in eleme
18480 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  nts */.  int *pn
18490 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
184a0 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
184b0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
184c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c 6c   */.  int *pnAll
184d0 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72 65  oc,     /* Curre
184e0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  nt size of the a
184f0 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c  llocation, in el
18500 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
18510 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
18520 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
18530 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
18540 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
18550 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45 6e   *z;.  if( *pnEn
18560 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20  try >= *pnAlloc 
18570 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
18580 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53 69  w;.    int newSi
18590 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  ze;.    newSize 
185a0 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b  = (*pnAlloc)*2 +
185b0 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20 70   initSize;.    p
185c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
185d0 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61  ealloc(db, pArra
185e0 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e 74  y, newSize*szEnt
185f0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
18600 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
18610 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
18620 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
18630 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f     }.    *pnAllo
18640 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
18650 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
18660 29 2f 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20 70  )/szEntry;.    p
18670 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
18680 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
18690 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
186a0 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a  &z[*pnEntry * sz
186b0 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
186c0 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a  ry);.  *pIdx = *
186d0 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e  pnEntry;.  ++*pn
186e0 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20  Entry;.  return 
186f0 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pArray;.}../*.**
18700 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c   Append a new el
18710 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76  ement to the giv
18720 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61  en IdList.  Crea
18730 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20  te a new IdList 
18740 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a  if.** need be..*
18750 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73  *.** A new IdLis
18760 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
18770 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63  r NULL if malloc
18780 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c  () fails..*/.IdL
18790 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
187a0 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33  stAppend(sqlite3
187b0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
187c0 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
187d0 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  en){.  int i;.  
187e0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
187f0 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
18800 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
18810 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73  db, sizeof(IdLis
18820 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
18830 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
18840 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
18850 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lloc = 0;.  }.  
18860 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74  pList->a = sqlit
18870 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
18880 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20  .      db,.     
18890 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20   pList->a,.     
188a0 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61   sizeof(pList->a
188b0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20  [0]),.      5,. 
188c0 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64       &pList->nId
188d0 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
188e0 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69  nAlloc,.      &i
188f0 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
18900 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
18910 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
18920 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
18930 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
18940 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
18950 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
18960 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
18970 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
18980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
18990 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
189a0 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
189b0 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
189c0 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
189d0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
189e0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
189f0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
18a00 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
18a10 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
18a20 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
18a30 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
18a40 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
18a50 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
18a60 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
18a70 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
18a80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18a90 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
18aa0 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
18ab0 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
18ac0 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
18ad0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
18ae0 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
18af0 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
18b00 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
18b10 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
18b20 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
18b30 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
18b40 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
18b50 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
18b60 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
18b70 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
18b80 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
18b90 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
18ba0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
18bb0 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
18bc0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
18bd0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
18be0 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
18bf0 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
18c00 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
18c10 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
18c20 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
18c30 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
18c40 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
18c50 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
18c60 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
18c70 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
18c80 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
18c90 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
18ca0 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
18cb0 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
18cc0 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
18cd0 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
18ce0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
18cf0 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
18d00 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
18d10 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
18d20 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
18d30 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
18d40 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
18d50 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
18d60 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
18d70 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
18d80 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
18d90 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
18da0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
18db0 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
18dc0 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
18dd0 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
18de0 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
18df0 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
18e00 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
18e10 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
18e20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
18e30 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
18e40 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
18e50 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
18e60 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
18e70 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
18e80 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
18e90 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
18ea0 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
18eb0 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
18ec0 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
18ed0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18ee0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
18ef0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
18f00 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
18f10 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
18f20 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
18f30 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
18f40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18f50 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
18f60 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
18f70 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
18f80 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18f90 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
18fa0 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
18fb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
18fc0 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
18fd0 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
18fe0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
18ff0 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
19000 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19010 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
19020 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
19030 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
19040 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
19050 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
19060 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
19070 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
19080 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b   if( pSrc->nSrc+
19090 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c  nExtra>pSrc->nAl
190a0 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  loc ){.    SrcLi
190b0 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e  st *pNew;.    in
190c0 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d  t nAlloc = pSrc-
190d0 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20  >nSrc+nExtra;.  
190e0 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20    int nGot;.    
190f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
19100 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
19110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19120 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
19130 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
19140 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
19150 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
19160 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
19170 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
19180 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
19190 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a  urn pSrc;.    }.
191a0 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b      pSrc = pNew;
191b0 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c  .    nGot = (sql
191c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
191d0 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a  (db, pNew) - siz
191e0 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65  eof(*pSrc))/size
191f0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31  of(pSrc->a[0])+1
19200 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c  ;.    pSrc->nAll
19210 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b 0a  oc = (u16)nGot;.
19220 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
19230 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
19240 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
19250 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
19260 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
19270 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
19280 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
19290 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
192a0 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
192b0 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
192c0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
192d0 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 31  Src->nSrc += (i1
192e0 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20  6)nExtra;..  /* 
192f0 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61  Zero the newly a
19300 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a  llocated slots *
19310 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63  /.  memset(&pSrc
19320 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ->a[iStart], 0, 
19330 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
19340 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f  ])*nExtra);.  fo
19350 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53  r(i=iStart; i<iS
19360 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b  tart+nExtra; i++
19370 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  ){.    pSrc->a[i
19380 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
19390 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e    }..  /* Return
193a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
193b0 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69  e enlarged SrcLi
193c0 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  st */.  return p
193d0 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  Src;.}.../*.** A
193e0 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
193f0 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
19400 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
19410 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
19420 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
19430 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
19440 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
19450 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
19460 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e   pTable is NULL.
19470 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74  .**.** A SrcList
19480 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
19490 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69   NULL if there i
194a0 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  s an OOM error. 
194b0 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   The returned.**
194c0 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62   SrcList might b
194d0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
194e0 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77  e SrcList that w
194f0 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d  as input or it m
19500 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77  ight be.** a new
19510 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d   one.  If an OOM
19520 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
19530 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69  rs, then the pri
19540 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73  or value of pLis
19550 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70  t.** that is inp
19560 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
19570 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  ne is automatica
19580 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  lly freed..**.**
19590 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73   If pDatabase is
195a0 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65   not null, it me
195b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62  ans that the tab
195c0 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e  le has an option
195d0 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e  al.** database n
195e0 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b  ame prefix.  Lik
195f0 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61  e this:  "databa
19600 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20  se.table".  The 
19610 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69  pDatabase.** poi
19620 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nts to the table
19630 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54   name and the pT
19640 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
19650 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
19660 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
19670 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64  .a[].zName field
19680 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
19690 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
196a0 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f  hich might.** co
196b0 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28  me from pTable (
196c0 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  if pDatabase is 
196d0 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44  NULL) or from pD
196e0 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72  atabase.  .** Sr
196f0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62  cList.a[].zDatab
19700 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ase is filled wi
19710 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
19720 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  name from pTable
19730 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c  ,.** or with NUL
19740 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65  L if no database
19750 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a   is specified..*
19760 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
19770 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b  rds, if call lik
19780 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
19790 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
197a0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
197b0 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
197c0 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
197d0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
197e0 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
197f0 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
19800 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
19810 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
19820 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
19830 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a  end(D,A,B,C);.**
19840 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
19850 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
19860 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
19870 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69  se name.  If C i
19880 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65  s defined.** the
19890 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f  n so is B.  In o
198a0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e  ther words, we n
198b0 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65  ever have a case
198c0 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   where:.**.**   
198d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
198e0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30  ListAppend(D,A,0
198f0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20  ,C);.**.** Both 
19900 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
19910 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64  base are assumed
19920 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20   to be quoted.  
19930 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65  They are dequote
19940 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e  d.** before bein
19950 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53  g added to the S
19960 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69  rcList..*/.SrcLi
19970 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
19980 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69  stAppend(.  sqli
19990 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
199a0 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
199b0 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
199c0 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
199d0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
199e0 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
199f0 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e   this SrcList. N
19a00 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65  ULL creates a ne
19a10 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54  w SrcList */.  T
19a20 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
19a30 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61     /* Table to a
19a40 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ppend */.  Token
19a50 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f   *pDatabase    /
19a60 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68  * Database of th
19a70 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
19a80 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19a90 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
19aa0 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d  sert( pDatabase=
19ab0 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20  =0 || pTable!=0 
19ac0 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
19ad0 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a  ve C without B *
19ae0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
19af0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
19b00 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
19b10 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  ero(db, sizeof(S
19b20 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
19b30 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
19b40 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
19b50 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
19b60 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c   }.  pList = sql
19b70 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
19b80 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c  ge(db, pList, 1,
19b90 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20   pList->nSrc);. 
19ba0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19bb0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
19bc0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
19bd0 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
19be0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19bf0 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
19c00 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
19c10 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
19c20 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
19c30 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
19c40 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
19c50 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
19c60 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
19c70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
19c80 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
19c90 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
19ca0 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
19cb0 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
19cc0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19cd0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
19ce0 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44  le);.  pItem->zD
19cf0 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
19d00 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
19d10 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  b, pDatabase);. 
19d20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
19d30 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
19d40 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
19d50 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
19d60 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
19d70 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
19d80 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
19d90 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
19da0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
19db0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
19dc0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19dd0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19de0 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
19df0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19e00 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
19e10 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
19e20 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
19e30 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
19e40 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
19e50 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
19e60 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
19e70 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
19e80 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
19e90 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
19ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
19eb0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
19ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
19ed0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
19ee0 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
19ef0 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
19f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19f10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
19f20 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
19f30 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
19f40 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
19f50 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
19f60 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
19f70 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
19f80 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
19f90 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
19fa0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19fb0 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
19fc0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
19fd0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
19fe0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
19ff0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1a000 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
1a010 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1a020 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
1a030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1a040 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1a050 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1a060 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1a070 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1a080 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a090 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  b, pItem->zIndex
1a0a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1a0b0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49  leteTable(db, pI
1a0c0 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
1a0d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1a0e0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1a0f0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
1a100 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1a110 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
1a120 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1a130 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1a140 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
1a150 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a160 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1a170 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a180 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
1a190 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64  he parser to add
1a1a0 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
1a1b0 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67  he.** end of a g
1a1c0 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75  rowing FROM clau
1a1d0 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72  se.  The "p" par
1a1e0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61  ameter is the pa
1a1f0 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f  rt of.** the FRO
1a200 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61  M clause that ha
1a210 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1a220 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22  onstructed.  "p"
1a230 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74   is NULL.** if t
1a240 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1a250 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
1a260 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c  M clause.  pTabl
1a270 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a  e and pDatabase.
1a280 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20  ** are the name 
1a290 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
1a2a0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
1a2b0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1a2c0 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74  se term..** pDat
1a2d0 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66  abase is NULL if
1a2e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1a2f0 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  me qualifier is 
1a300 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a  missing - the.**
1a310 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66   usual case.  If
1a320 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20   the term has a 
1a330 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
1a340 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
1a350 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
1a360 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
1a370 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
1a380 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
1a390 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
1a3a0 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
1a3b0 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
1a3c0 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
1a3d0 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
1a3e0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
1a3f0 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
1a400 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
1a410 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
1a420 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
1a430 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
1a440 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1a450 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
1a460 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
1a470 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
1a480 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
1a490 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
1a4a0 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
1a4b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1a4c0 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
1a4d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1a4e0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1a4f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1a500 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
1a510 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
1a520 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
1a530 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
1a540 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
1a550 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
1a560 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1a570 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
1a580 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
1a590 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
1a5a0 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
1a5b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1a5c0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1a5d0 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
1a5e0 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
1a5f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1a600 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1a610 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
1a620 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
1a630 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
1a640 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
1a650 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
1a660 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
1a670 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a690 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
1a6a0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
1a6b0 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
1a6c0 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
1a6d0 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
1a6e0 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
1a6f0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1a700 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
1a710 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1a720 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
1a730 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
1a740 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1a750 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1a760 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
1a770 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1a780 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
1a790 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
1a7a0 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
1a7b0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1a7c0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
1a7d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1a7e0 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
1a7f0 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
1a800 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
1a810 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20  VER(p->nSrc==0) 
1a820 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1a830 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1a840 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
1a850 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1a860 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
1a870 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
1a880 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
1a890 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
1a8a0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1a8b0 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
1a8c0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
1a8d0 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
1a8e0 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
1a8f0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1a900 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1a910 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
1a920 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
1a930 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
1a940 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1a950 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1a960 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1a970 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
1a980 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1a990 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1a9a0 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
1a9b0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1a9c0 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
1a9d0 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
1a9e0 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
1a9f0 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
1aa00 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
1aa10 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1aa20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1aa30 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1aa40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1aa50 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
1aa60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1aa70 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
1aa80 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
1aa90 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
1aaa0 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
1aab0 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53   && ALWAYS(p->nS
1aac0 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72  rc>0) ){.    str
1aad0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1aae0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1aaf0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1ab00 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e  assert( pItem->n
1ab10 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20  otIndexed==0 && 
1ab20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30  pItem->zIndex==0
1ab30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
1ab40 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
1ab50 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
1ab60 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
1ab70 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
1ab80 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
1ab90 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
1aba0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
1abb0 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
1abc0 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1abd0 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e      pItem->notIn
1abe0 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1abf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1ac00 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
1ac10 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1ac20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
1ac30 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
1ac40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1ac50 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
1ac60 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
1ac70 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
1ac80 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
1ac90 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
1aca0 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1acb0 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
1acc0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1acd0 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
1ace0 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1acf0 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
1ad00 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
1ad10 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
1ad20 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
1ad30 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
1ad40 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
1ad50 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
1ad60 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
1ad70 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
1ad80 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
1ad90 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1ada0 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
1adb0 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
1adc0 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
1add0 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
1ade0 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
1adf0 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
1ae00 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
1ae10 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
1ae20 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
1ae30 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
1ae40 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
1ae50 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
1ae60 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
1ae70 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
1ae80 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
1ae90 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
1aea0 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
1aeb0 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
1aec0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  t *p){.  if( p &
1aed0 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e  & p->a ){.    in
1aee0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
1aef0 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
1af00 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
1af10 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  i].jointype = p-
1af20 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
1af30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
1af40 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  [0].jointype = 0
1af50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
1af60 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
1af70 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1af80 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
1af90 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1afa0 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
1afb0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
1afc0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
1afd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1afe0 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  e!=0 );.  db = p
1aff0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
1b000 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a  ert( db!=0 );./*
1b010 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d    if( db->aDb[0]
1b020 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1b030 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  ; */.  if( sqlit
1b040 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1b050 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1b060 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
1b070 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1b080 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1b090 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1b0a0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
1b0b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1b0c0 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
1b0d0 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
1b0e0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1b0f0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1b100 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b110 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1b120 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
1b130 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20  USIVE)+1);.     
1b140 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
1b150 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20  Btree(v, i);.   
1b160 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1b170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b180 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
1b190 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
1b1a0 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
1b1b0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
1b1c0 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
1b1d0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1b1e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1b1f0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
1b200 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1b210 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
1b220 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
1b230 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69  ( db!=0 );./*  i
1b240 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  f( db->aDb[0].pB
1b250 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a  t==0 ) return; *
1b260 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
1b270 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1b280 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1b290 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
1b2a0 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1b2b0 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1b2c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1b2d0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1b2e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b2f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1b300 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a  oCommit, 1, 0);.
1b310 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
1b320 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1b330 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1b340 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
1b350 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
1b360 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1b370 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1b380 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1b390 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
1b3a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1b3b0 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f  sert( db!=0 );./
1b3c0 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30  *  if( db->aDb[0
1b3d0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1b3e0 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  n; */.  if( sqli
1b3f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1b400 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1b410 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
1b420 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
1b430 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1b440 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1b450 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1b460 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1b470 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b480 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1b490 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
1b4a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b4b0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1b4c0 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
1b4d0 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
1b4e0 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
1b4f0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1b500 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
1b510 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
1b520 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
1b530 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1b540 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
1b550 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
1b560 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1b570 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1b580 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
1b590 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1b5a0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1b5b0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1b5c0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
1b5d0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1b5e0 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
1b5f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
1b600 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
1b610 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
1b620 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
1b630 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
1b640 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
1b650 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1b660 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
1b670 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
1b680 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
1b690 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
1b6a0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1b6b0 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
1b6c0 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
1b6d0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1b6e0 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1b6f0 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
1b700 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1b710 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b720 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
1b730 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
1b740 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
1b750 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
1b760 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1b770 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
1b780 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
1b790 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
1b7a0 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
1b7b0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
1b7c0 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
1b7d0 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
1b7e0 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1b7f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b800 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1b810 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1b820 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1b830 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1b840 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
1b850 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
1b860 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
1b870 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
1b880 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
1b890 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
1b8a0 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
1b8b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1b8c0 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
1b8d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1b8e0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
1b8f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1b900 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
1b910 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1b920 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1b930 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b940 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
1b950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1b960 74 72 65 65 4f 70 65 6e 28 30 2c 20 64 62 2c 20  treeOpen(0, db, 
1b970 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
1b980 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b9a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b9b0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
1b9c0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
1b9d0 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
1b9e0 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
1b9f0 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
1ba00 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
1ba10 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1ba20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
1ba30 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
1ba40 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
1ba50 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1ba60 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
1ba70 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
1ba80 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
1ba90 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
1baa0 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
1bab0 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
1bac0 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d  ) ){.      db->m
1bad0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
1bae0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1baf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1bb00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1bb10 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
1bb20 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72  de that will ver
1bb30 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
1bb40 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a  ookie and start.
1bb50 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  ** a read-transa
1bb60 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61  ction for all na
1bb70 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
1bb80 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  es..**.** It is 
1bb90 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
1bba0 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  ll schema cookie
1bbb0 73 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e  s be verified an
1bbc0 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72  d all.** read tr
1bbd0 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74  ansactions be st
1bbe0 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79  arted before any
1bbf0 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65  thing else happe
1bc00 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42  ns in.** the VDB
1bc10 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20  E program.  But 
1bc20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
1bc30 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
1bc40 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63   much other.** c
1bc50 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e  ode has been gen
1bc60 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65  erated.  So here
1bc70 20 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a   is what we do:.
1bc80 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1bc90 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
1bca0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
1bcb0 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20  code an OP_Goto 
1bcc0 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d  that.** will jum
1bcd0 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e  p to a subroutin
1bce0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
1bcf0 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68  the program.  Th
1bd00 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20  en we.** record 
1bd10 65 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74  every database t
1bd20 68 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63  hat needs its sc
1bd30 68 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e  hema verified in
1bd40 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e   the.** pParse->
1bd50 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64  cookieMask field
1bd60 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20  .  Later, after 
1bd70 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  all other code h
1bd80 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72  as been.** gener
1bd90 61 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75  ated, the subrou
1bda0 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74  tine that does t
1bdb0 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
1bdc0 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73  cations and.** s
1bdd0 74 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61  tarts the transa
1bde0 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63  ctions will be c
1bdf0 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f  oded and the OP_
1be00 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a  Goto P2 value.**
1be10 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
1be20 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73   point to that s
1be30 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
1be40 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  generation of th
1be50 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69  e.** cookie veri
1be60 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74  fication subrout
1be70 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73  ine code happens
1be80 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73   in sqlite3Finis
1be90 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a  hCoding()..**.**
1bea0 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63   If iDb<0 then c
1beb0 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ode the OP_Goto 
1bec0 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74  only - don't set
1bed0 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20   flag to verify 
1bee0 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e  the.** schema on
1bef0 20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20   any databases. 
1bf00 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
1bf10 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68  d to position th
1bf20 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72  e OP_Goto.** ear
1bf30 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20  ly in the code, 
1bf40 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69  before we know i
1bf50 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74  f any database t
1bf60 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73  ables will be us
1bf70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1bf80 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1bf90 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
1bfa0 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  e, int iDb){.  P
1bfb0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1bfc0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1bfd0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1bfe0 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c  .  if( pToplevel
1bff0 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20  ->cookieGoto==0 
1c000 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1c010 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1c020 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20  pToplevel);.    
1c030 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
1c040 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79  n;  /* This only
1c050 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72   happens if ther
1c060 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72  e was a prior er
1c070 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70 6c  ror */.    pTopl
1c080 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  evel->cookieGoto
1c090 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1c0a0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1c0b0 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20   0, 0)+1;.  }.  
1c0c0 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
1c0d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c0e0 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20  pToplevel->db;. 
1c0f0 20 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b     yDbMask mask;
1c100 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ..    assert( iD
1c110 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
1c120 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
1c130 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
1c140 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  iDb==1 );.    as
1c150 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
1c160 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
1c170 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1c180 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
1c190 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
1c1a0 29 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20  ) );.    mask = 
1c1b0 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44  ((yDbMask)1)<<iD
1c1c0 62 3b 0a 20 20 20 20 69 66 28 20 28 70 54 6f 70  b;.    if( (pTop
1c1d0 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
1c1e0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  k & mask)==0 ){.
1c1f0 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
1c200 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d  >cookieMask |= m
1c210 61 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  ask;.      pTopl
1c220 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  evel->cookieValu
1c230 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
1c240 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
1c250 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20  chema_cookie;.  
1c260 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1c270 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
1c280 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c290 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1c2a0 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20  e(pToplevel);.  
1c2b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c2c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1c2d0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1c2e0 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
1c2f0 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1c300 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1c310 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
1c320 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
1c330 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
1c340 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
1c350 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
1c360 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
1c370 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
1c380 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
1c390 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
1c3a0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
1c3b0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
1c3c0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
1c3d0 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
1c3e0 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
1c3f0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
1c400 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
1c410 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
1c420 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
1c430 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
1c440 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
1c450 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
1c460 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
1c470 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
1c480 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
1c490 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
1c4a0 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
1c4b0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
1c4c0 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
1c4d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
1c4e0 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
1c4f0 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1c500 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
1c510 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
1c520 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
1c530 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
1c540 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
1c550 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
1c560 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
1c570 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
1c580 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
1c590 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1c5a0 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
1c5b0 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
1c5c0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1c5d0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1c5e0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
1c5f0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1c600 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
1c610 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  b);.  pToplevel-
1c620 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28 28  >writeMask |= ((
1c630 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b  yDbMask)1)<<iDb;
1c640 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
1c650 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
1c660 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
1c670 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
1c680 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
1c690 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1c6a0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
1c6b0 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
1c6c0 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
1c6d0 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
1c6e0 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
1c6f0 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
1c700 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
1c710 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
1c720 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
1c730 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
1c740 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
1c750 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
1c760 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
1c770 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
1c780 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
1c790 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
1c7a0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
1c7b0 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
1c7c0 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
1c7d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
1c7e0 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
1c7f0 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
1c800 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1c810 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1c820 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
1c830 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1c840 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
1c850 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
1c860 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
1c870 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
1c880 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
1c890 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
1c8a0 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
1c8b0 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
1c8c0 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
1c8d0 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
1c8e0 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
1c8f0 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
1c900 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
1c910 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
1c920 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
1c930 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
1c940 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
1c950 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1c960 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
1c970 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
1c980 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
1c990 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
1c9a0 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
1c9b0 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
1c9c0 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
1c9d0 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
1c9e0 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
1c9f0 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
1ca00 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
1ca10 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
1ca20 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
1ca30 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
1ca40 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
1ca50 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
1ca60 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
1ca70 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
1ca80 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
1ca90 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
1caa0 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
1cab0 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
1cac0 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
1cad0 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
1cae0 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
1caf0 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
1cb00 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
1cb10 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
1cb20 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
1cb30 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
1cb40 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
1cb50 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
1cb60 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
1cb70 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
1cb80 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
1cb90 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
1cba0 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
1cbb0 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
1cbc0 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
1cbd0 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
1cbe0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1cbf0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1cc00 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
1cc10 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
1cc20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
1cc30 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
1cc40 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
1cc50 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
1cc60 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
1cc70 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
1cc80 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
1cc90 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
1cca0 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
1ccb0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
1ccc0 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
1ccd0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1cce0 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
1ccf0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
1cd00 72 61 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  raint(Parse *pPa
1cd10 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
1cd20 2c 20 63 68 61 72 20 2a 70 34 2c 20 69 6e 74 20  , char *p4, int 
1cd30 70 34 74 79 70 65 29 7b 0a 20 20 56 64 62 65 20  p4type){.  Vdbe 
1cd40 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1cd50 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1cd60 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
1cd70 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
1cd80 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
1cd90 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
1cda0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1cdb0 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
1cdc0 43 4f 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45 72  CONSTRAINT, onEr
1cdd0 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
1cde0 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  pe);.}../*.** Ch
1cdf0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
1ce00 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
1ce10 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1ce20 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
1ce30 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
1ce40 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
1ce50 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
1ce60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ce70 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1ce80 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
1ce90 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
1cea0 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
1ceb0 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
1cec0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
1ced0 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
1cee0 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
1cef0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1cf00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1cf10 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1cf20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
1cf30 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30  !=0 );.    if( 0
1cf40 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1cf50 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
1cf60 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1cf70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1cf80 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
1cf90 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1cfa0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1cfb0 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
1cfc0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1cfd0 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
1cfe0 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1cff0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1d000 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
1d010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d020 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1d030 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
1d040 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1d050 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
1d060 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1d070 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
1d080 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1d090 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1d0a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1d0b0 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
1d0c0 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
1d0d0 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1d0e0 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
1d0f0 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
1d100 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
1d110 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
1d120 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
1d130 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1d140 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
1d150 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
1d160 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
1d170 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1d180 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1d190 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
1d1a0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1d1b0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1d1c0 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
1d1d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1d1e0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1d1f0 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
1d200 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
1d210 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
1d220 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
1d230 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1d240 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
1d250 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1d260 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
1d270 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
1d280 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
1d290 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1d2a0 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
1d2b0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1d2c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1d2d0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1d2e0 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d300 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
1d310 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
1d320 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1d330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1d340 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1d350 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1d360 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d370 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1d380 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1d390 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
1d3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d3b0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1d3c0 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1d3d0 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
1d3e0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1d3f0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
1d400 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
1d410 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1d420 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
1d430 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20  lMutexes(db) ); 
1d440 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73   /* Needed for s
1d450 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a  chema access */.
1d460 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
1d470 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
1d480 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
1d490 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
1d4a0 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
1d4b0 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
1d4c0 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
1d4d0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
1d4e0 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
1d4f0 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
1d500 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
1d510 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
1d520 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
1d530 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1d540 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
1d550 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1d560 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d570 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
1d580 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
1d590 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5b0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
1d5c0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1d5d0 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1d5f0 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
1d600 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1d610 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
1d620 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
1d630 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1d640 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
1d650 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
1d660 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
1d670 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
1d680 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
1d690 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
1d6a0 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
1d6b0 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1d6c0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
1d6d0 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
1d6e0 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
1d6f0 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
1d700 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
1d710 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1d720 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
1d730 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1d740 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1d750 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1d760 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1d770 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
1d780 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
1d790 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
1d7a0 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
1d7b0 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
1d7c0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1d7d0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
1d7e0 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
1d7f0 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
1d800 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d820 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
1d830 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1d840 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d850 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1d860 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1d870 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
1d880 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1d890 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1d8a0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1d8b0 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
1d8c0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1d8d0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1d8e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d8f0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
1d900 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1d910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1d920 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1d930 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1d940 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1d950 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1d960 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1d970 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
1d980 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1d990 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
1d9a0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
1d9b0 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
1d9c0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1d9d0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1d9e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d9f0 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1da00 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1da10 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1da20 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1da30 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1da40 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1da50 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1da60 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1da70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
1da80 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  me1==0 ){.    re
1da90 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1daa0 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
1dab0 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
1dac0 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d  f( NEVER(pName2=
1dad0 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  =0) || pName2->z
1dae0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
1daf0 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
1db00 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
1db10 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
1db20 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1db30 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
1db40 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
1db50 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
1db60 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1db70 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
1db80 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
1db90 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  l, 0);.    if( p
1dba0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
1dbb0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1dbc0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
1dbd0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1dbe0 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
1dbf0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1dc00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
1dc10 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
1dc20 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1dc30 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
1dc40 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
1dc50 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
1dc60 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
1dc70 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
1dc80 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1dc90 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
1dca0 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
1dcb0 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
1dcc0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1dcd0 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
1dce0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
1dcf0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
1dd00 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
1dd10 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
1dd20 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
1dd30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1dd40 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
1dd50 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
1dd60 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1dd70 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
1dd80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1dd90 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
1dda0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
1ddb0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1ddc0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
1ddd0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1dde0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1ddf0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1de00 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
1de10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1de20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1de30 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
1de40 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
1de50 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
1de60 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1de70 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63  Return a dynamic
1de80 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79  ly allocated Key
1de90 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
1dea0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a  hat can be used.
1deb0 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52  ** with OP_OpenR
1dec0 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72  ead or OP_OpenWr
1ded0 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  ite to access da
1dee0 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64  tabase index pId
1def0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  x..**.** If succ
1df00 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65  essful, a pointe
1df10 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72  r to the new str
1df20 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e  ucture is return
1df30 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
1df40 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
1df50 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1df60 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
1df70 33 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e  3DbFree(db, ) on
1df80 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a   the returned .*
1df90 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e  * pointer. If an
1dfa0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f   error occurs (o
1dfb0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20  ut of memory or 
1dfc0 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  missing collatio
1dfd0 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c  n .** sequence),
1dfe0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1dff0 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  d and the state 
1e000 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65  of pParse update
1e010 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20  d to reflect.** 
1e020 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65  the error..*/.Ke
1e030 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e  yInfo *sqlite3In
1e040 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65  dexKeyinfo(Parse
1e050 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
1e060 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
1e070 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
1e080 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
1e090 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65  nt nBytes = size
1e0a0 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  of(KeyInfo) + (n
1e0b0 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f  Col-1)*sizeof(Co
1e0c0 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a  llSeq*) + nCol;.
1e0d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e0e0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
1e0f0 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b  yInfo *pKey = (K
1e100 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33  eyInfo *)sqlite3
1e110 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1e120 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28   nBytes);..  if(
1e130 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65   pKey ){.    pKe
1e140 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  y->db = pParse->
1e150 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53  db;.    pKey->aS
1e160 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
1e170 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e  )&(pKey->aColl[n
1e180 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  Col]);.    asser
1e190 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f  t( &pKey->aSortO
1e1a0 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28  rder[nCol]==&(((
1e1b0 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65  u8 *)pKey)[nByte
1e1c0 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  s]) );.    for(i
1e1d0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
1e1e0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
1e1f0 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
1e200 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  ll[i];.      ass
1e210 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20  ert( zColl );.  
1e220 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
1e230 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  i] = sqlite3Loca
1e240 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
1e250 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
1e260 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1e270 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
1e280 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
1e290 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c  .    pKey->nFiel
1e2a0 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20  d = (u16)nCol;. 
1e2b0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
1e2c0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
1e2d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1e2e0 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
1e2f0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1e300 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.