/ Hex Artifact Content
Login

Artifact 6c60478a1e23f7cdd30ae0251b46f9adbe0e98c2:


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 29 3b  eady(v, pParse);
1970: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1980: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1990: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
19a0: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
19b0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
19c0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
19d0: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
19e0: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
19f0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
1a00: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1a10: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1a20: 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  ar = 0;.  pParse
1a30: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30  ->cookieMask = 0
1a40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  ;.  pParse->cook
1a50: 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f  ieGoto = 0;.}../
1a60: 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72  *.** Run the par
1a70: 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ser and code gen
1a80: 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65  erator recursive
1a90: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ly in order to g
1aa0: 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20  enerate.** code 
1ab0: 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74  for the SQL stat
1ac0: 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f  ement given onto
1ad0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1ae0: 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a  pParse context.*
1af0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
1b00: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1b10: 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   When the parser
1b20: 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76   is run recursiv
1b30: 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c  ely.** this way,
1b40: 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61   the final OP_Ha
1b50: 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64  lt is not append
1b60: 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69  ed and other ini
1b70: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61  tialization.** a
1b80: 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  nd finalization 
1b90: 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65  steps are omitte
1ba0: 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20  d because those 
1bb0: 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20  are handling by 
1bc0: 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74  the.** outermost
1bd0: 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   parser..**.** N
1be0: 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  ot everything is
1bf0: 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73   nestable.  This
1c00: 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73   facility is des
1c10: 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a  igned to permit.
1c20: 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  ** INSERT, UPDAT
1c30: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70  E, and DELETE op
1c40: 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74  erations against
1c50: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20   SQLITE_MASTER. 
1c60: 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20   Use.** care if 
1c70: 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72  you decide to tr
1c80: 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f  y to use this ro
1c90: 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f  utine for some o
1ca0: 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a  ther purposes..*
1cb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65  /.void sqlite3Ne
1cc0: 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20  stedParse(Parse 
1cd0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1ce0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1cf0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1d00: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
1d10: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1d20: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1d30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d40: 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53  .# define SAVE_S
1d50: 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65  Z  (sizeof(Parse
1d60: 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72  ) - offsetof(Par
1d70: 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72  se,nVar)).  char
1d80: 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a   saveBuf[SAVE_SZ
1d90: 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  ];..  if( pParse
1da0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
1db0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1dc0: 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20  e->nested<10 ); 
1dd0: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75   /* Nesting shou
1de0: 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69  ld only be of li
1df0: 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20  mited depth */. 
1e00: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1e10: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
1e20: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
1e30: 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  (db, zFormat, ap
1e40: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
1e50: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
1e60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20  {.    return;   
1e70: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74  /* A malloc must
1e80: 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1e90: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
1ea0: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
1eb0: 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72 73  (saveBuf, &pPars
1ec0: 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a  e->nVar, SAVE_SZ
1ed0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61  );.  memset(&pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41  rse->nVar, 0, SA
1ef0: 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65  VE_SZ);.  sqlite
1f00: 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72 73  3RunParser(pPars
1f10: 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73  e, zSql, &zErrMs
1f20: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f30: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1f40: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1f50: 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d  e(db, zSql);.  m
1f60: 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e  emcpy(&pParse->n
1f70: 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41  Var, saveBuf, SA
1f80: 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  VE_SZ);.  pParse
1f90: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f  ->nested--;.}../
1fa0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
1fb0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
1fc0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
1fd0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1fe0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
1ff0: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2000: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2010: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2020: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2030: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2040: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2050: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2060: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2070: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2080: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2090: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
20a0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
20b0: 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  nd the.** first 
20c0: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69  matching table i
20d0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
20e0: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75   checking for du
20f0: 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a  plicate table.**
2100: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2110: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2120: 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73 74  er is TEMP first
2130: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
2140: 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61  n any.** auxilia
2150: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2160: 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ed using the ATT
2170: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  ACH command..**.
2180: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
2190: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29  te3LocateTable()
21a0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
21b0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c  te3FindTable(sql
21c0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
21d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
21e0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61  st char *zDataba
21f0: 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20  se){.  Table *p 
2200: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
2210: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73  int nName;.  ass
2220: 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b  ert( zName!=0 );
2230: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
2240: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
2250: 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  );.  /* All mute
2260: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2270: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2280: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2290: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
22a0: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
22b0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
22c0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
22d0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66  texes(db) );.  f
22e0: 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42  or(i=OMIT_TEMPDB
22f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2300: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  ){.    int j = (
2310: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
2320: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
2330: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
2340: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
2350: 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  e!=0 && sqlite3S
2360: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
2370: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
2380: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
2390: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
23a0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
23b0: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
23c0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
23d0: 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62  ashFind(&db->aDb
23e0: 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  [j].pSchema->tbl
23f0: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
2400: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
2410: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2420: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
2430: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
2440: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2450: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2460: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2470: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2480: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2490: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
24a0: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
24b0: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
24c0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
24d0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
24e0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
24f0: 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c  t found.  Also l
2500: 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eave an.** error
2510: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2520: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
2530: 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2540: 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2550: 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74  outine and sqlit
2560: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73  e3FindTable() is
2570: 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f   that this.** ro
2580: 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20  utine leaves an 
2590: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
25a0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
25b0: 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65   where.** sqlite
25c0: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65  3FindTable() doe
25d0: 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20  s not..*/.Table 
25e0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
25f0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
2600: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2610: 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63   context in whic
2620: 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  h to report erro
2630: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69  rs */.  int isVi
2640: 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ew,            /
2650: 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e  * True if lookin
2660: 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74  g for a VIEW rat
2670: 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45  her than a TABLE
2680: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2690: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20   *zName,     /* 
26a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
26b0: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
26c0: 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   for */.  const 
26d0: 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20  char *zDbase    
26e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
26f0: 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74  database.  Might
2700: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
2710: 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a   Table *p;..  /*
2720: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
2730: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
2740: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
2750: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2760: 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
2770: 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
2780: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
2790: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
27a0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
27b0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
27c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
27d0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
27e0: 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
27f0: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  ->db, zName, zDb
2800: 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
2810: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2820: 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65  ar *zMsg = isVie
2830: 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65  w ? "no such vie
2840: 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61  w" : "no such ta
2850: 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ble";.    if( zD
2860: 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71  base ){.      sq
2870: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2880: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
2890: 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c  ", zMsg, zDbase,
28a0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
28b0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
28c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28d0: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
28e0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
28f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
2900: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d  kSchema = 1;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2920: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2930: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2940: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2950: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2960: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2970: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2980: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2990: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
29a0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
29b0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
29c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
29d0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
29e0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
29f0: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2a00: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2a10: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2a20: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2a30: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2a40: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2a50: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2a60: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2a70: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2a80: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2a90: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2aa0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2ab0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2ac0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2ad0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2ae0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2af0: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2b00: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2b10: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2b20: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2b30: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2b40: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2b50: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2b60: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2b70: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2b80: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2b90: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2ba0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2bb0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2bc0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2bd0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2be0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2bf0: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2c00: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2c10: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2c20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2c30: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2c40: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2c50: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2c60: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2c70: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2c80: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2c90: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2ca0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2cb0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2cc0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2cd0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ce0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2cf0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2d00: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
2d10: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
2d20: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
2d30: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
2d40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2d50: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2d80: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
2d90: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
2da0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
2db0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
2dc0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
2dd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2de0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
2df0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2e00: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
2e10: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
2e20: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2e30: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2e40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2e50: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
2e60: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
2e70: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
2e80: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
2e90: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
2ea0: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
2eb0: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
2ec0: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
2ed0: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
2ee0: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2ef0: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
2f00: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2f10: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
2f20: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
2f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
2f40: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
2f50: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
2f60: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
2f70: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
2f80: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
2f90: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61  .  int len;.  Ha
2fa0: 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73  sh *pHash;..  as
2fb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
2fc0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
2fd0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48   iDb, 0) );.  pH
2fe0: 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  ash = &db->aDb[i
2ff0: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db].pSchema->idx
3000: 48 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  Hash;.  len = sq
3010: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
3020: 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65  dxName);.  pInde
3030: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3040: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3050: 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a  xName, len, 0);.
3060: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
3070: 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20  dex) ){.    if( 
3080: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3090: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
30a0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
30b0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
30c0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
30d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30e0: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
30f0: 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f   /* Justificatio
3100: 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20  n of ALWAYS();  
3110: 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  The index must b
3120: 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  e on the list of
3130: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65  .      ** indice
3140: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20  s. */.      p = 
3150: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
3160: 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68  pIndex;.      wh
3170: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26  ile( ALWAYS(p) &
3180: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3190: 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  ex ){ p = p->pNe
31a0: 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  xt; }.      if( 
31b0: 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70  ALWAYS(p && p->p
31c0: 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b  Next==pIndex) ){
31d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
31e0: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
31f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
3200: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
3210: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
3220: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3230: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3240: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
3250: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
3260: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
3270: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
3280: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
3290: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
32a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
32b0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
32c0: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
32d0: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
32e0: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
32f0: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
3300: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
3310: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
3320: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
3330: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
3340: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
3350: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
3360: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
3370: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30  ..**.** If iDb<0
3380: 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
3390: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
33a0: 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64  tables for all d
33b0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73  atabase.** files
33c0: 2e 20 20 49 66 20 69 44 62 3e 3d 30 20 74 68 65  .  If iDb>=0 the
33d0: 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65  n reset the inte
33e0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20  rnal schema for 
33f0: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67  only the.** sing
3400: 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65  le file indicate
3410: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3420: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
3430: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
3440: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69  b, int iDb){.  i
3450: 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72  nt i, j;.  asser
3460: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
3470: 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20  ;..  if( iDb>=0 
3480: 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31  ){.    /* Case 1
3490: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
34a0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
34b0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
34c0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
34d0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
34e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3500: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
3510: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
3520: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3530: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
3540: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
3550: 61 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  a);..    /* If a
3560: 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65  ny database othe
3570: 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72  r than TEMP is r
3580: 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20  eset, then also 
3590: 72 65 73 65 74 20 54 45 4d 50 0a 20 20 20 20 2a  reset TEMP.    *
35a0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
35b0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
35c0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
35d0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
35e0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
35f0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
3600: 2f 0a 20 20 20 20 69 66 28 20 69 44 62 21 3d 31  /.    if( iDb!=1
3610: 20 29 7b 0a 20 20 20 20 20 20 70 44 62 20 3d 20   ){.      pDb = 
3620: 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20 20  &db->aDb[1];.   
3630: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
3640: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
3650: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3660: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
3670: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
3680: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f 2a  return;.  }.  /*
3690: 20 43 61 73 65 20 32 20 28 66 72 6f 6d 20 68 65   Case 2 (from he
36a0: 72 65 20 74 6f 20 74 68 65 20 65 6e 64 29 3a 20  re to the end): 
36b0: 52 65 73 65 74 20 61 6c 6c 20 73 63 68 65 6d 61  Reset all schema
36c0: 73 20 66 6f 72 20 61 6c 6c 20 61 74 74 61 63 68  s for all attach
36d0: 65 64 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  ed.  ** database
36e0: 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
36f0: 69 44 62 3c 30 20 29 3b 0a 20 20 73 71 6c 69 74  iDb<0 );.  sqlit
3700: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
3710: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
3720: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3730: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
3740: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3750: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
3760: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
3770: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3780: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3790: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
37a0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
37b0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
37c0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
37d0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
37e0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
37f0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  db);..  /* If on
3800: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
3810: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3820: 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65  ase files has be
3830: 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20  en closed,.  ** 
3840: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d  then remove them
3850: 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69   from the auxili
3860: 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73  ary database lis
3870: 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a  t.  We take the.
3880: 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79    ** opportunity
3890: 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65   to do this here
38a0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a   since we have j
38b0: 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20  ust deleted all 
38c0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65  of the.  ** sche
38d0: 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61  ma hash tables a
38e0: 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20  nd therefore do 
38f0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65  not have to make
3900: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a   any changes.  *
3910: 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73  * to any of thos
3920: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
3930: 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64 62   for(i=j=2; i<db
3940: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
3950: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
3960: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3970: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
3980: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
3990: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
39a0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
39b0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b   pDb->zName = 0;
39c0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
39d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
39e0: 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  <i ){.      db->
39f0: 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62  aDb[j] = db->aDb
3a00: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  [i];.    }.    j
3a10: 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ++;.  }.  memset
3a20: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c  (&db->aDb[j], 0,
3a30: 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a   (db->nDb-j)*siz
3a40: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29 29  eof(db->aDb[j]))
3a50: 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  ;.  db->nDb = j;
3a60: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
3a70: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
3a80: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
3a90: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
3aa0: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
3ab0: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
3ac0: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
3ad0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
3ae0: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
3af0: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
3b00: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
3b10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3b20: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3b30: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
3b40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
3b50: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
3b60: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
3b70: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
3b80: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
3b90: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
3ba0: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
3bb0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
3bc0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
3bd0: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
3be0: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
3bf0: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
3c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3c10: 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
3c20: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
3c30: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
3c40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
3c50: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
3c60: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
3c70: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
3c80: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
3c90: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
3ca0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
3cb0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
3cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3cd0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
3ce0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
3cf0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3d00: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
3d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3d20: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
3d30: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
3d40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
3d50: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
3d60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3d70: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
3d80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
3d90: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3da0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3db0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
3dc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
3dd0: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3de0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3df0: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
3e00: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
3e10: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
3e20: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
3e30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3e40: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
3e50: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
3e60: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
3e70: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
3e80: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
3e90: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
3ea0: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
3eb0: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
3ec0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3ed0: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
3ee0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
3ef0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3f00: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
3f10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
3f20: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
3f30: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3f40: 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20  Table){.  Index 
3f50: 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b  *pIndex, *pNext;
3f60: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61  ..  assert( !pTa
3f70: 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e  ble || pTable->n
3f80: 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  Ref>0 );..  /* D
3f90: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
3fa0: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
3fb0: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3fc0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
3fd0: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
3fe0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
3ff0: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
4000: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
4010: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
4020: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )>0) ) return;..
4030: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4040: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4050: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4060: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4070: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4080: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4090: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
40a0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
40b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
40c0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
40d0: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
40e0: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
40f0: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
4100: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4110: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
4120: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
4130: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
4140: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
4150: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4160: 73 65 72 74 28 0a 09 20 20 26 70 49 6e 64 65 78  sert(..  &pIndex
4170: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4180: 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  sh, zName, sqlit
4190: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
41a0: 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  ), 0.      );.  
41b0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
41c0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
41d0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
41e0: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
41f0: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
4200: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
4210: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
4220: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
4230: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
4240: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
4250: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4260: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4270: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4280: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4290: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
42a0: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
42b0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
42c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
42d0: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
42e0: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
42f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4300: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
4310: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
4320: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4330: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
4340: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
4350: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
4360: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
4370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
4380: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  K.  sqlite3ExprD
4390: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
43a0: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69  ->pCheck);.#endi
43b0: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
43c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
43d0: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
43e0: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
43f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
4400: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4410: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
4420: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
4430: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
4440: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
4450: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
4460: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
4470: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4480: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4490: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
44a0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
44b0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
44c0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
44d0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
44e0: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
44f0: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
4500: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
4510: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
4520: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
4530: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
4540: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
4550: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4560: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4570: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4580: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
4590: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
45a0: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
45b0: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
45c0: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
45d0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
45e0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
45f0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4600: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
4610: 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  abName,.        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4640: 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20  zTabName),0);.  
4650: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4660: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
4670: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4680: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4690: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
46a0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
46b0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
46c0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
46d0: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
46e0: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
46f0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
4700: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
4710: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4720: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
4730: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
4740: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
4750: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
4760: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
4770: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
4780: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
4790: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
47a0: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
47b0: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
47c0: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
47d0: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
47e0: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
47f0: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
4800: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
4810: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
4820: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
4830: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
4840: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
4850: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
4860: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
4870: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
4880: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4890: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
48a0: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
48b0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
48c0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
48d0: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
48e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
48f0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
4900: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
4910: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
4920: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
4930: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
4940: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
4950: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
4960: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
4970: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
4980: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
4990: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
49a0: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
49b0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
49c0: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
49d0: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
49e0: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
49f0: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
4a00: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
4a10: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
4a20: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
4a30: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
4a40: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
4a50: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
4a60: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
4a70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4a80: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
4a90: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
4aa0: 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
4ab0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
4ac0: 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50  -1, (char *)5, P
4ad0: 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20  4_INT32);  /* 5 
4ae0: 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a  column table */.
4af0: 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30    if( p->nTab==0
4b00: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20   ){.    p->nTab 
4b10: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
4b20: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d  * Parameter zNam
4b30: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  e points to a nu
4b40: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66  l-terminated buf
4b50: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
4b60: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
4b70: 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22  database ("main"
4b80: 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  , "temp" or the 
4b90: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
4ba0: 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a  hed db). This.**
4bb0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4bc0: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4bd0: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
4be0: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
4bf0: 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20  or.** -1 if the 
4c00: 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20  named db cannot 
4c10: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
4c20: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
4c30: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
4c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4c50: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
4c60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
4c70: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
4c80: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
4c90: 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
4ca0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
4cb0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
4cc0: 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e      for(i=(db->n
4cd0: 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e  Db-1), pDb=&db->
4ce0: 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d  aDb[i]; i>=0; i-
4cf0: 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20  -, pDb--){.     
4d00: 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50   if( (!OMIT_TEMP
4d10: 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20  DB || i!=1 ) && 
4d20: 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n==sqlite3Strlen
4d30: 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26  30(pDb->zName) &
4d40: 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d  & .          0==
4d50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
4d60: 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  Db->zName, zName
4d70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
4d80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4d90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  }.  }.  return i
4da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74  ;.}../*.** The t
4db0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74  oken *pName cont
4dc0: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ains the name of
4dd0: 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74   a database (eit
4de0: 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a  her "main" or.**
4df0: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
4e00: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
4e10: 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75  ed db). This rou
4e20: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
4e30: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
4e40: 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
4e50: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72  in db->aDb[], or
4e60: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
4e70: 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   db .** does not
4e80: 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73   exist..*/.int s
4e90: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c  qlite3FindDb(sql
4ea0: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
4eb0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *pName){.  int i
4ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4ef0: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  er */.  char *zN
4f00: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f20: 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72  Name we are sear
4f30: 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a  ching for */.  z
4f40: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4f50: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
4f60: 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71  pName);.  i = sq
4f70: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
4f80: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71  db, zName);.  sq
4f90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4fa0: 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
4fb0: 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61   i;.}../* The ta
4fc0: 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74  ble or view or t
4fd0: 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70  rigger name is p
4fe0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
4ff0: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
5000: 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70  .** pName1 and p
5010: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
5020: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
5030: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
5040: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
5050: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5060: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20  x.yyy (...);.** 
5070: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5080: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5090: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
50a0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
50b0: 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  and if.** the ta
50c0: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
50d0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
50e0: 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45   i.e.:.**.** CRE
50f0: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
5100: 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70  .);.**.** Then p
5110: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5120: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5130: 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68   is ""..**.** Th
5140: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
5150: 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f  the *ppUnqual po
5160: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5170: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5180: 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32  me1 or.** pName2
5190: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
51a0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
51b0: 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69  ble name.  The i
51c0: 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64  ndex of the.** d
51d0: 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73  atabase "xxx" is
51e0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
51f0: 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  t sqlite3TwoPart
5200: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
5210: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
5220: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
5230: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
5240: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5250: 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54  Name1,      /* T
5260: 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20  he "xxx" in the 
5270: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f  name "xxx.yyy" o
5280: 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b  r "xxx" */.  Tok
5290: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
52a0: 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e   /* The "yyy" in
52b0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
52c0: 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  yy" */.  Token *
52d0: 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20  *pUnqual     /* 
52e0: 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c  Write the unqual
52f0: 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d  ified object nam
5300: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
5310: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
5320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5330: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
5340: 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  he object */.  s
5350: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5360: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
5370: 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30  ALWAYS(pName2!=0
5380: 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  ) && pName2->n>0
5390: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
53a0: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
53b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
53c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
53d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
53e0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
53f0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
5400: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
5410: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
5420: 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  me2;.    iDb = s
5430: 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c  qlite3FindDb(db,
5440: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
5450: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20  ( iDb<0 ){.     
5460: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5470: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
5480: 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20  n database %T", 
5490: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70  pName1);.      p
54a0: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
54b0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
54c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
54d0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
54e0: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
54f0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
5500: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
5510: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
5520: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
5530: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
5540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5550: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
5560: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
5570: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
5580: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
5590: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
55a0: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
55b0: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
55c0: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
55d0: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
55e0: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
55f0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
5600: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
5610: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
5620: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
5630: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
5640: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
5650: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
5660: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
5670: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
5680: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
5690: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
56a0: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
56b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
56c0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
56d0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
56e0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
56f0: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
5700: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
5710: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
5720: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
5730: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
5740: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
5750: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
5760: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
5770: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5780: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
5790: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
57a0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
57b0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
57c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
57d0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
57e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
57f0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
5800: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
5810: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
5820: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
5830: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
5840: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
5850: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
5860: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
5870: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
5880: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5890: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
58a0: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
58b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
58c0: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
58d0: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
58e0: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
58f0: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
5900: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
5910: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
5920: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
5930: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
5940: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
5950: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
5960: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
5970: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
5980: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
5990: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
59a0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
59b0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
59c0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
59d0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
59e0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
59f0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
5a00: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
5a10: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
5a20: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
5a30: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
5a40: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
5a50: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
5a60: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
5a70: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
5a80: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
5a90: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
5aa0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
5ab0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
5ac0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
5ad0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
5ae0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
5af0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
5b00: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
5b10: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
5b20: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
5b30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
5b40: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
5b50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
5b60: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
5b70: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
5b80: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5b90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
5ba0: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
5bb0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
5bc0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
5bd0: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
5be0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
5bf0: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
5c00: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5c10: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
5c20: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
5c30: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
5c40: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
5c50: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
5c60: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5c70: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
5c80: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
5c90: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
5ca0: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
5cb0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
5cc0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
5cd0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
5ce0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
5cf0: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
5d00: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
5d10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
5d20: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
5d30: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
5d40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5d50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
5d60: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
5d70: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5d80: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
5d90: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
5da0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
5db0: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
5dc0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
5dd0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
5de0: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
5df0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
5e00: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
5e10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5e20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5e30: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
5e40: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
5e50: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
5e60: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
5e70: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
5e80: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
5e90: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
5ea0: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
5eb0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5ec0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
5ed0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5ee0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
5ef0: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
5f00: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
5f10: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
5f20: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
5f30: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5f40: 2e 2e 29 3b 0a 20 20 2a 2a 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 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
5f70: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
5f80: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
5f90: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
5fa0: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
5fb0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
5fc0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
5fd0: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5fe0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5ff0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
6000: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
6010: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
6020: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
6030: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
6040: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
6050: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
6060: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
6070: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
6080: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
6090: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
60a0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
60b0: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
60c0: 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54  urn;.  if( !OMIT
60d0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
60e0: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
60f0: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6100: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
6110: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
6120: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
6130: 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e  be qualified. Un
6140: 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65  less .    ** the
6150: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
6160: 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e  s "temp" anyway.
6170: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
6180: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6190: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
61a0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
61b0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
61c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
61d0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
61e0: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
61f0: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
6200: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
6210: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
6220: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6230: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
6240: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
6250: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6260: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6270: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6280: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
6290: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
62a0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
62b0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
62c0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
62d0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
62e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
62f0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
6300: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
6310: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
6320: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
6330: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
6340: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
6350: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6360: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6370: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
6380: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6390: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
63a0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
63b0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
63c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
63d0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
63e0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
63f0: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
6400: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6410: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
6420: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
6430: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6440: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
6450: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
6460: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6470: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6480: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6490: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
64a0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
64b0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
64c0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
64d0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
64e0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
64f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
6500: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
6510: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6520: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
6530: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6540: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6550: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6560: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6570: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6580: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6590: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
65a0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
65b0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
65c0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
65d0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
65e0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
65f0: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6600: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6610: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6620: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6630: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6640: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
6650: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6660: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
6670: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6680: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6690: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
66a0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
66b0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
66c0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
66d0: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
66e0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
66f0: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6700: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
6710: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
6720: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53  zName;.    if( S
6730: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
6740: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
6750: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
6760: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6770: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6780: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6790: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
67a0: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  me, zDb);.    if
67b0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
67c0: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
67d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
67e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
67f0: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
6800: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
6810: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6820: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6830: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
6840: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6850: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
6860: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
6870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
6880: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6890: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
68a0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
68b0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
68c0: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
68d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
68e0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
68f0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
6900: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
6910: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
6920: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6930: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
6940: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
6950: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
6960: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
6970: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
6980: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
6990: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
69a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
69b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
69c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
69d0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
69e0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
69f0: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
6a00: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
6a10: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
6a20: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
6a30: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
6a40: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
6a50: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
6a60: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73    pTable->nRowEs
6a70: 74 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 61  t = 1000000;.  a
6a80: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
6a90: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
6aa0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6ab0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
6ac0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
6ad0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
6ae0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
6af0: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
6b00: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
6b10: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
6b20: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
6b30: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6b40: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
6b50: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
6b60: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
6b70: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
6b80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6b90: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
6ba0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
6bb0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
6bc0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
6bd0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
6be0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
6bf0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
6c00: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
6c10: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
6c20: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
6c30: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
6c40: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
6c50: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
6c60: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
6c70: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
6c80: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
6c90: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
6ca0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
6cb0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
6cc0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
6cd0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
6ce0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
6cf0: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
6d00: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
6d10: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
6d20: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
6d30: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
6d40: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
6d50: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
6d60: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
6d70: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
6d80: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
6d90: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
6da0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
6db0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
6dc0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
6dd0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6de0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
6df0: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
6e00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
6e10: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
6e20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
6e30: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
6e40: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
6e50: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
6e60: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
6e70: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
6e80: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
6e90: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
6ea0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
6eb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6ec0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6ed0: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
6ee0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6ef0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
6f00: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
6f10: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
6f20: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
6f30: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
6f40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
6f50: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
6f60: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
6f70: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
6f80: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
6f90: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
6fa0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6fb0: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
6fc0: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
6fd0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
6fe0: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
6ff0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7000: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7010: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7020: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7030: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7040: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7050: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7060: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
7070: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
7080: 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69  f, reg3);.    fi
7090: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
70a0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
70b0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
70c0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
70d0: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
70e0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
70f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7100: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7110: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
7120: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7140: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
7150: 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  iDb, BTREE_FILE_
7160: 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20  FORMAT, reg3);. 
7170: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7180: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7190: 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67  er, ENC(db), reg
71a0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
71b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
71c0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
71d0: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
71e0: 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  ING, reg3);.    
71f0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7200: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20  ere(v, j1);..   
7210: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
7220: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
7230: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
7240: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
7250: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
7260: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
7270: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
7280: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
7290: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
72a0: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
72b0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
72c0: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
72d0: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
72e0: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
72f0: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
7300: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
7310: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
7320: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
7330: 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68  Rowid..    ** Th
7340: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
7350: 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
7360: 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72  ble is left in r
7370: 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  eg pParse->regRo
7380: 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ot..    ** The r
7390: 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61  owid and root pa
73a0: 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73  ge number values
73b0: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
73c0: 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  he code that.   
73d0: 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61   ** sqlite3EndTa
73e0: 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ble will generat
73f0: 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64  e..    */.#if !d
7400: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7410: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
7420: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7430: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
7440: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c     if( isView ||
7450: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7470: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7480: 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20  ger, 0, reg2);. 
7490: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
74a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
74b0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
74c0: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
74d0: 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20   iDb, reg2);.   
74e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
74f0: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
7500: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
7510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7520: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7530: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
7540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7550: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
7560: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7580: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
7590: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
75a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
75b0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
75c0: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
75d0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
75e0: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
75f0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
7600: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
7610: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
7620: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
7630: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
7640: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
7650: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
7660: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
7670: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
7680: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  }../*.** This ma
7690: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63  cro is used to c
76a0: 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e  ompare two strin
76b0: 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73  gs in a case-ins
76c0: 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e  ensitive manner.
76d0: 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74  .** It is slight
76e0: 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63  ly faster than c
76f0: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74  alling sqlite3St
7700: 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79  rICmp() directly
7710: 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65  , but.** produce
7720: 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a  s larger code..*
7730: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
7740: 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  is macro is not 
7750: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
7760: 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d  the strcmp() fam
7770: 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72  ily. It.** retur
7780: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  ns true if the t
7790: 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65  wo strings are e
77a0: 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  qual, otherwise 
77b0: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  false..*/.#defin
77c0: 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20  e STRICMP(x, y) 
77d0: 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54  (\.sqlite3UpperT
77e0: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
77f0: 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20  d char *)(x)]== 
7800: 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72    \.sqlite3Upper
7810: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
7820: 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20  ed char *)(y)]  
7830: 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53     \.&& sqlite3S
7840: 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29  trICmp((x)+1,(y)
7850: 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20  +1)==0 )../*.** 
7860: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
7870: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
7880: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
7890: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
78a0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
78b0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
78c0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
78d0: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
78e0: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
78f0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7900: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
7910: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
7920: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
7930: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
7940: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
7950: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
7960: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
7970: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
7980: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
7990: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
79a0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
79b0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
79c0: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
79d0: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
79e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
79f0: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
7a00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7a10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
7a20: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
7a30: 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  UMN.  if( p->nCo
7a40: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  l+1>db->aLimit[S
7a50: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
7a60: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
7a70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7a80: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
7a90: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
7aa0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
7ab0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
7ac0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
7ad0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
7ae0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
7af0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
7b00: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
7b10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
7b20: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
7b30: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
7b40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7b50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
7b60: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
7b70: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
7b80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7b90: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
7ba0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7bb0: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
7bc0: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
7bd0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
7be0: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
7bf0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
7c00: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
7c10: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
7c20: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
7c30: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
7c40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7c50: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
7c60: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
7c70: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
7c80: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
7c90: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
7ca0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
7cb0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
7cc0: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
7cd0: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
7ce0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
7cf0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
7d00: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
7d10: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
7d20: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
7d30: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
7d40: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
7d50: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
7d60: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
7d70: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
7d80: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
7d90: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
7da0: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
7db0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
7dc0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  _AFF_NONE;.  p->
7dd0: 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nCol++;.}../*.**
7de0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7df0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
7e00: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
7e10: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
7e20: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
7e30: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7e40: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
7e50: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
7e60: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
7e70: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
7e80: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
7e90: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
7ea0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
7eb0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
7ec0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
7ed0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
7ee0: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
7ef0: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
7f00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7f10: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
7f20: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
7f30: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
7f40: 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b  Col<1) ) return;
7f50: 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  .  p->aCol[p->nC
7f60: 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol-1].notNull = 
7f70: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  (u8)onError;.}..
7f80: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
7f90: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
7fa0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
7fb0: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
7fc0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
7fd0: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
7fe0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7ff0: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
8000: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
8010: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
8020: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
8030: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
8040: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
8050: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
8060: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
8070: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
8080: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
8090: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
80a0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
80b0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
80c0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
80d0: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
80e0: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
80f0: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
8100: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
8110: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
8120: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
8130: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
8140: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
8150: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
8160: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8190: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
81a0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
81b0: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
81c0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
81d0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
81e0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
81f0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8200: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
8210: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8220: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
8230: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
8240: 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  NE.** 'REAL'    
8250: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8260: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
8270: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8280: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
8290: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
82a0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
82b0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
82c0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
82d0: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
82e0: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
82f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
8300: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8310: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
8320: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
8330: 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 75 33 32  har *zIn){.  u32
8340: 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61   h = 0;.  char a
8350: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8360: 4e 55 4d 45 52 49 43 3b 0a 0a 20 20 69 66 28 20  NUMERIC;..  if( 
8370: 7a 49 6e 20 29 20 77 68 69 6c 65 28 20 7a 49 6e  zIn ) while( zIn
8380: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
8390: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
83a0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
83b0: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
83c0: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
83d0: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
83e0: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
83f0: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
8400: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
8410: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8420: 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d  AFF_TEXT; .    }
8430: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
8440: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
8450: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
8460: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
8470: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
8480: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
8490: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
84a0: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
84b0: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
84c0: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
84d0: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
84e0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
84f0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
8500: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
8510: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
8520: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
8530: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
8540: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
8550: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8560: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
8570: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
8580: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8590: 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65  AFF_NONE;.#ifnde
85a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
85b0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
85c0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
85d0: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
85e0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
85f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
8600: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
8610: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8620: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8630: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8640: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
8650: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
8660: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
8670: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
8680: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
8690: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
86a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
86b0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
86c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
86d0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
86e0: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
86f0: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
8700: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8710: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
8720: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
8730: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
8740: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8750: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
8760: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
8770: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
8780: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
8790: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
87a0: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
87b0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
87c0: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
87d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
87e0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66   }..  return aff
87f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8800: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8810: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8820: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8830: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8840: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
8850: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
8860: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
8870: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
8880: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
8890: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
88a0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
88b0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
88c0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
88d0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
88e0: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
88f0: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
8900: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
8910: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
8920: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
8930: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
8940: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
8950: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
8960: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
8970: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
8980: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
8990: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
89a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
89b0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
89c0: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
89d0: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
89e0: 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72  Col;..  p = pPar
89f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8a00: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8a10: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8a20: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
8a30: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
8a40: 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  l-1];.  assert( 
8a50: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
8a60: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
8a70: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
8a80: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
8a90: 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f  b, pType);.  pCo
8aa0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
8ab0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
8ac0: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
8ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
8ae0: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
8af0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
8b00: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
8b10: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
8b20: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
8b30: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8b40: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
8b50: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
8b60: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
8b70: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
8b80: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
8b90: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
8ba0: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
8bb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8bc0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
8bd0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
8be0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
8bf0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
8c00: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8c10: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
8c20: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
8c30: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
8c40: 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70  rse, ExprSpan *p
8c50: 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Span){.  Table *
8c60: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
8c70: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
8c80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8c90: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
8ca0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21  wTable;.  if( p!
8cb0: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
8cc0: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
8cd0: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
8ce0: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
8cf0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
8d00: 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29  (pSpan->pExpr) )
8d10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8d20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8d30: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
8d40: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
8d50: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
8d60: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
8d70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
8d80: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
8d90: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
8da0: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
8db0: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
8dc0: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
8dd0: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
8de0: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
8df0: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
8e00: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
8e10: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
8e20: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
8e30: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
8e40: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
8e50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
8e60: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
8e70: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
8e80: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
8e90: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
8ea0: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58  pSpan->pExpr, EX
8eb0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
8ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8ed0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
8ee0: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
8ef0: 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >zDflt = sqlite3
8f00: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
8f10: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
8f20: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
8f50: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
8f60: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
8f70: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8f80: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8f90: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
8fa0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
8fb0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
8fc0: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
8fd0: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
8fe0: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
8ff0: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
9000: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
9010: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
9020: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
9030: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
9040: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
9050: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
9060: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
9070: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
9080: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
9090: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
90a0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
90b0: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
90c0: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
90d0: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
90e0: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
90f0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
9100: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
9110: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
9120: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
9130: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
9140: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
9150: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
9160: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
9170: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
9180: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
9190: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
91a0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
91b0: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
91c0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
91d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
91e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
91f0: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
9200: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
9210: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
9220: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
9230: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
9240: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
9250: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
9260: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
9270: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
9280: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
9290: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
92a0: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
92b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
92c0: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
92d0: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
92e0: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
92f0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
9300: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9310: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9320: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
9330: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
9340: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
9350: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
9360: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
9370: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
9380: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
9390: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
93a0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
93b0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
93c0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
93d0: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
93e0: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
93f0: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
9400: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
9410: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
9420: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9430: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
9440: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
9450: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20 70  = -1, i;.  if( p
9460: 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  Tab==0 || IN_DEC
9470: 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
9480: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
9490: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
94a0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
94b0: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
94c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
94d0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
94e0: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
94f0: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
9500: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
9510: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
9520: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
9530: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
9540: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
9550: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
9560: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
9570: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
9580: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
9590: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
95a0: 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20  ol].isPrimKey = 
95b0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
95c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
95d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
95e0: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
95f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9600: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
9610: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
9620: 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
9630: 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61  ].zName, pTab->a
9640: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
9650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
9660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9670: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9680: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
9690: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Col ){.        p
96a0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
96b0: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
96c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
96d0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
96e0: 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b  r>1 ) iCol = -1;
96f0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
9700: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
9710: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79  >nCol ){.    zTy
9720: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
9730: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d  iCol].zType;.  }
9740: 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26 20  .  if( zType && 
9750: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
9760: 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29  Type, "INTEGER")
9770: 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 73  ==0.        && s
9780: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
9790: 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70  _SO_ASC ){.    p
97a0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
97b0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
97c0: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
97d0: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
97e0: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
97f0: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
9800: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
9810: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
9820: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65  oincrement;.  }e
9830: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
9840: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
9850: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
9860: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
9870: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9880: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
9890: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
98a0: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
98b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
98c0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
98d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78  }else{.    Index
98e0: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
98f0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
9900: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
9910: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
9920: 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72   0, 0, sortOrder
9930: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
9940: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  ){.      p->auto
9950: 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20 7d  Index = 2;.    }
9960: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  .    pList = 0;.
9970: 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79    }..primary_key
9980: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
9990: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
99a0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
99b0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
99c0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
99d0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
99e0: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
99f0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9a00: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
9a10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68  oid sqlite3AddCh
9a20: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  eckConstraint(. 
9a30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9a40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9a50: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
9a60: 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20  *pCheckExpr  /* 
9a70: 54 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73  The check expres
9a80: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  sion */.){.  sql
9a90: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9aa0: 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
9ab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
9ac0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
9ad0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9ae0: 6c 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26  le;.  if( pTab &
9af0: 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  & !IN_DECLARE_VT
9b00: 41 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  AB ){.    pTab->
9b10: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
9b20: 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62  ExprAnd(db, pTab
9b30: 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b  ->pCheck, pCheck
9b40: 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Expr);.  }else.#
9b50: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
9b60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9b70: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
9b80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
9b90: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
9ba0: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
9bb0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
9bc0: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
9bd0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
9be0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
9bf0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
9c00: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
9c10: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9c20: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
9c30: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
9c40: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
9c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
9c60: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
9c70: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
9c80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
9c90: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
9ca0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
9cb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9cc0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
9cd0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
9ce0: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
9cf0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9d00: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
9d10: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
9d20: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
9d30: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
9d40: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
9d50: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
9d60: 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  dx;.    p->aCol[
9d70: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
9d80: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
9d90: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
9da0: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
9db0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
9dc0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
9dd0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
9de0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
9df0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
9e00: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
9e10: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
9e20: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
9e30: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
9e40: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
9e50: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
9e60: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
9e70: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9e80: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9e90: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
9ea0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
9eb0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9ec0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
9ed0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
9ee0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
9ef0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
9f00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
9f10: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
9f20: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
9f30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9f40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
9f50: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
9f60: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
9f70: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
9f80: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
9f90: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
9fa0: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
9fb0: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
9fc0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
9fd0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
9fe0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
9ff0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
a000: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
a010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
a020: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
a030: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
a040: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
a050: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
a060: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
a070: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
a080: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
a090: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
a0a0: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
a0b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
a0c0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
a0d0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
a0e0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
a0f0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
a100: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
a110: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
a120: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
a130: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
a140: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
a150: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
a160: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
a170: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
a180: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
a190: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
a1a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a1b0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
a1c0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
a1d0: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
a1e0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
a1f0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
a200: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
a210: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
a220: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
a230: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
a240: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a250: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
a260: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
a270: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
a280: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
a290: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
a2a0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
a2b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
a2c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
a2d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a2e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
a2f0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
a300: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
a310: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
a320: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
a330: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
a340: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
a350: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
a360: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
a370: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
a380: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
a390: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
a3a0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
a3b0: 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20  ollSeq(db, enc, 
a3c0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
a3d0: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
a3e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
a3f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a400: 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f  no such collatio
a410: 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c  n sequence: %s",
a420: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
a430: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
a440: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
a450: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
a460: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
a470: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
a480: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
a490: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
a4a0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a4b0: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
a4c0: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
a4d0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
a4e0: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
a4f0: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
a500: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
a510: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
a520: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
a530: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
a540: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
a550: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
a560: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
a570: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
a580: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
a590: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
a5a0: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
a5b0: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
a5c0: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
a5d0: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
a5e0: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
a5f0: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
a600: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
a610: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
a620: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
a630: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
a640: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
a650: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
a660: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
a670: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
a680: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
a690: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
a6a0: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
a6b0: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
a6c0: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
a6d0: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
a6e0: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
a6f0: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
a700: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
a710: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
a720: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
a730: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a740: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
a750: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
a760: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a770: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a780: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
a790: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a7a0: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
a7b0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
a7c0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
a7d0: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
a7e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a7f0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
a800: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
a810: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
a820: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
a830: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a840: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
a850: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
a860: 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71  RSION, r1);.  sq
a870: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a880: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a8a0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a8b0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a8c0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a8d0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a8e0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a8f0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a900: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a910: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a920: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a930: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a940: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a950: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
a960: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
a970: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
a980: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
a990: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a9a0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
a9b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a9c0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
a9d0: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
a9e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a9f0: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
aa00: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
aa10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
aa20: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
aa30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
aa40: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
aa50: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
aa60: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
aa70: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
aa80: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
aa90: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
aaa0: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
aab0: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
aac0: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
aad0: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
aae0: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
aaf0: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
ab00: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
ab10: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
ab20: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
ab30: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
ab40: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
ab50: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
ab60: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
ab70: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
ab80: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
ab90: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
aba0: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
abb0: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
abc0: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
abd0: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
abe0: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
abf0: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
ac00: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
ac10: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
ac20: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
ac30: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
ac40: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
ac50: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
ac60: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
ac70: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
ac80: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
ac90: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
aca0: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
acb0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
acc0: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
acd0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
ace0: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
acf0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
ad00: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
ad10: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
ad20: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
ad30: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
ad40: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
ad50: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
ad60: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
ad70: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
ad80: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
ad90: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
ada0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
adb0: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
adc0: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 20  igit(zIdent[0]) 
add0: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
ade0: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
adf0: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 21  !=TK_ID;.  if( !
ae00: 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20 20  needQuote ){.   
ae10: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49 64   needQuote = zId
ae20: 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69  ent[j];.  }..  i
ae30: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
ae40: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
ae50: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
ae60: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
ae70: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
ae80: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
ae90: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
aea0: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
aeb0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
aec0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
aed0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
aee0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
aef0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
af00: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
af10: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
af20: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
af30: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
af40: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
af50: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
af60: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
af70: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
af80: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
af90: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
afa0: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
afb0: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
afc0: 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69  teTableStmt(sqli
afd0: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
afe0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
aff0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
b000: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
b010: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
b020: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
b030: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
b040: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
b050: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
b060: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
b070: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
b080: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20  (pCol->zName) + 
b090: 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  5;.  }.  n += id
b0a0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
b0b0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
b0c0: 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ){ .    zSep = "
b0d0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
b0e0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
b0f0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
b100: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
b110: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
b120: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
b130: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
b140: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
b150: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
b160: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
b170: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d  , n);.  if( zStm
b180: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  t==0 ){.    db->
b190: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
b1a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
b1b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
b1c0: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
b1d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
b1e0: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
b1f0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
b200: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
b210: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
b220: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
b230: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
b240: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
b250: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
b260: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
b270: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
b280: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
b290: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
b2a0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
b2b0: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
b2c0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
b2d0: 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22  FF_NONE    */ ""
b2e0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
b2f0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
b300: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
b310: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
b320: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
b330: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
b340: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
b350: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
b360: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
b370: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
b380: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
b390: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
b3a0: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
b3b0: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
b3c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
b3d0: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
b3e0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
b3f0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
b400: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
b410: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
b420: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
b430: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20  ITE_AFF_TEXT >= 
b440: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
b450: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
b460: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
b470: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
b480: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
b490: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
b4a0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
b4b0: 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74  TEXT );.    test
b4c0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
b4d0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
b4e0: 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73  _NONE );.    tes
b4f0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
b500: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
b510: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
b520: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
b530: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b540: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
b550: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b560: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
b570: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
b580: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
b590: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
b5a0: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
b5b0: 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20  E_AFF_TEXT];.   
b5c0: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
b5d0: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
b5e0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
b5f0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
b600: 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20  E_AFF_NONE .    
b610: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
b620: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
b630: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
b640: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d 65 6d  Type) );.    mem
b650: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
b660: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
b670: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
b680: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
b690: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
b6a0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
b6b0: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
b6c0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
b6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b6e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b6f0: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
b700: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
b710: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
b720: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
b730: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
b740: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
b750: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
b760: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
b770: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
b780: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
b790: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
b7a0: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
b7b0: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
b7c0: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
b7d0: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
b7e0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
b7f0: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
b800: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
b810: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
b820: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
b830: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
b840: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
b850: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
b860: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
b870: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
b880: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b890: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
b8a0: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
b8b0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
b8c0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
b8d0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
b8e0: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
b8f0: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
b900: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
b910: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
b920: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
b930: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
b940: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
b950: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
b960: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
b970: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
b980: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
b990: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
b9a0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
b9b0: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
b9c0: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
b9d0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
b9e0: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
b9f0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
ba00: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
ba10: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
ba20: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
ba30: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
ba40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
ba50: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
ba60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
ba70: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
ba80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
ba90: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
baa0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
bab0: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
bac0: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
bad0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
bae0: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
baf0: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
bb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
bb10: 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e   final ')' token
bb20: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
bb30: 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ABLE */.  Select
bb40: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
bb50: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
bb60: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
bb70: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
bb80: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71    Table *p;.  sq
bb90: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
bba0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
bbb0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d  b;..  if( (pEnd=
bbc0: 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30  =0 && pSelect==0
bbd0: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
bbe0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
bbf0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70  urn;.  }.  p = p
bc00: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
bc10: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
bc20: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
bc30: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
bc40: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
bc50: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
bc60: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
bc70: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
bc80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bc90: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
bca0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
bcb0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
bcc0: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
bcd0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
bce0: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72  pCheck ){.    Sr
bcf0: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd10: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
bd20: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
bd30: 62 6c 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  ble */.    NameC
bd40: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
bd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
bd60: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
bd70: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
bd80: 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   */..    memset(
bd90: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
bda0: 73 4e 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  sNC));.    memse
bdb0: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
bdc0: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73  of(sSrc));.    s
bdd0: 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Src.nSrc = 1;.  
bde0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
bdf0: 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  e = p->zName;.  
be00: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62    sSrc.a[0].pTab
be10: 20 3d 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61   = p;.    sSrc.a
be20: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
be30: 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
be40: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
be50: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
be60: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43  Src;.    sNC.isC
be70: 68 65 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66  heck = 1;.    if
be80: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
be90: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
bea0: 70 2d 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20  p->pCheck) ){.  
beb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bec0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
bed0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bee0: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
bef0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
bf00: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
bf10: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
bf20: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
bf30: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
bf40: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
bf50: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
bf60: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
bf70: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
bf80: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
bf90: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
bfa0: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
bfb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
bfc0: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
bfd0: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
bfe0: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
bff0: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
c000: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
c010: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
c020: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
c030: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
c040: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
c050: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
c060: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
c070: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
c080: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e  ..  /* If not in
c090: 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e  itializing, then
c0a0: 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64   create a record
c0b0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
c0c0: 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53  le.  ** in the S
c0d0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c0e0: 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  le of the databa
c0f0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
c100: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f   this is a TEMPO
c110: 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74  RARY table, writ
c120: 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f  e the entry into
c130: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20   the auxiliary. 
c140: 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64   ** file instead
c150: 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   of into the mai
c160: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
c170: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
c180: 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
c190: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62    int n;.    Vdb
c1a0: 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
c1b0: 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69  zType;    /* "vi
c1c0: 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a  ew" or "table" *
c1d0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  /.    char *zTyp
c1e0: 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20  e2;   /* "VIEW" 
c1f0: 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20  or "TABLE" */.  
c200: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20    char *zStmt;  
c210: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
c220: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72   CREATE TABLE or
c230: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
c240: 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76  tement */..    v
c250: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c260: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
c270: 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
c280: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71   return;..    sq
c290: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c2a0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b  v, OP_Close, 0);
c2b0: 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a  ..    /* .    **
c2c0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70   Initialize zTyp
c2d0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69  e for the new vi
c2e0: 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20  ew or table..   
c2f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
c300: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
c310: 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20     /* A regular 
c320: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a  table */.      z
c330: 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a  Type = "table";.
c340: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
c350: 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20  TABLE";.#ifndef 
c360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
c370: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c380: 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20    /* A view */. 
c390: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69       zType = "vi
c3a0: 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  ew";.      zType
c3b0: 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64  2 = "VIEW";.#end
c3c0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
c3d0: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52   If this is a CR
c3e0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53  EATE TABLE xx AS
c3f0: 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65   SELECT ..., exe
c400: 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a  cute the SELECT.
c410: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
c420: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
c430: 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20   new table. The 
c440: 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
c450: 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20   for the.    ** 
c460: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20  new table is in 
c470: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
c480: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
c490: 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65  .    ** Once the
c4a0: 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
c4b0: 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65   coded by sqlite
c4c0: 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73  3Select(), it is
c4d0: 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69   in a.    ** sui
c4e0: 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71  table state to q
c4f0: 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c  uery for the col
c500: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79  umn names and ty
c510: 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20  pes to be used. 
c520: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77     ** by the new
c530: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20   table..    **. 
c540: 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63     ** A shared-c
c550: 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ache write-lock 
c560: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
c570: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
c580: 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a  new table,.    *
c590: 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f  * as a schema-lo
c5a0: 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ck must have alr
c5b0: 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e  eady been obtain
c5c0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ed to create it.
c5d0: 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20   Since.    ** a 
c5e0: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c  schema-lock excl
c5f0: 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64  udes all other d
c600: 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74  atabase users, t
c610: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f  he write-lock wo
c620: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  uld.    ** be re
c630: 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a  dundant..    */.
c640: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
c650: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  ){.      SelectD
c660: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
c670: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a  Table *pSelTab;.
c680: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
c690: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a  arse->nTab==1);.
c6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c6b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
c6c0: 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72  enWrite, 1, pPar
c6d0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62  se->regRoot, iDb
c6e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c6f0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
c700: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
c710: 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  ->nTab = 2;.    
c720: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c730: 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
c740: 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20  RT_Table, 1);.  
c750: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c760: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
c770: 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  t, &dest);.     
c780: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c790: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
c7a0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  1);.      if( pP
c7b0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
c7c0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
c7d0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
c7e0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
c7f0: 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  se, pSelect);.  
c800: 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61        if( pSelTa
c810: 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  b==0 ) return;. 
c820: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c830: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
c840: 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70       p->nCol = p
c850: 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
c860: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20        p->aCol = 
c870: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
c880: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c890: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
c8a0: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
c8b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
c8c0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
c8d0: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
c8e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c8f0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
c900: 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
c910: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
c920: 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  ement */.    if(
c930: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
c940: 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65    zStmt = create
c950: 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29  TableStmt(db, p)
c960: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c970: 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
c980: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
c990: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31  NameToken.z) + 1
c9a0: 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  ;.      zStmt = 
c9b0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c9c0: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43  b, .          "C
c9d0: 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20  REATE %s %.*s", 
c9e0: 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73  zType2, n, pPars
c9f0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a  e->sNameToken.z.
ca00: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
ca10: 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f      /* A slot fo
ca20: 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73  r the record has
ca30: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
ca40: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a  located in the .
ca50: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41      ** SQLITE_MA
ca60: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20  STER table.  We 
ca70: 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64  just need to upd
ca80: 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69  ate that slot wi
ca90: 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68  th all.    ** th
caa0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65  e information we
cab0: 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20  've collected.. 
cac0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
cad0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
cae0: 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41  rse,.      "UPDA
caf0: 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20  TE %Q.%s ".     
cb00: 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25      "SET type='%
cb10: 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c  s', name=%Q, tbl
cb20: 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61  _name=%Q, rootpa
cb30: 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22  ge=#%d, sql=%Q "
cb40: 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72  .       "WHERE r
cb50: 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20  owid=#%d",.     
cb60: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
cb70: 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
cb80: 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54  E(iDb),.      zT
cb90: 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ype,.      p->zN
cba0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e  ame,.      p->zN
cbb0: 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73  ame,.      pPars
cbc0: 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20  e->regRoot,.    
cbd0: 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70    zStmt,.      p
cbe0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a  Parse->regRowid.
cbf0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
cc00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
cc10: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
cc20: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
cc30: 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  rse, iDb);..#ifn
cc40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cc50: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
cc60: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
cc70: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
cc80: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
cc90: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
cca0: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
ccb0: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
ccc0: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
ccd0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
cce0: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
ccf0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
cd00: 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d  .      Db *pDb =
cd10: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
cd20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
cd30: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
cd40: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
cd50: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
cd60: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71  b->pSchema->pSeq
cd70: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
cd80: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
cd90: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
cda0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
cdb0: 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73  ABLE %Q.sqlite_s
cdc0: 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71  equence(name,seq
cdd0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  )",.          pD
cde0: 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  b->zName.       
cdf0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
ce00: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
ce10: 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68   Reparse everyth
ce20: 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75  ing to update ou
ce30: 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  r internal data 
ce40: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
ce50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ce60: 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
ce70: 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
ce80: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
ce90: 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d  ntf(db, "tbl_nam
cea0: 65 3d 27 25 71 27 22 2c 20 70 2d 3e 7a 4e 61 6d  e='%q'", p->zNam
ceb0: 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  e));.  }...  /* 
cec0: 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f  Add the table to
ced0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
cee0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
cef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
cf00: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
cf10: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54  it.busy ){.    T
cf20: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
cf30: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
cf40: 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
cf50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cf60: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
cf70: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
cf80: 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74      pOld = sqlit
cf90: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53  e3HashInsert(&pS
cfa0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
cfb0: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
cfe0: 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29  rlen30(p->zName)
cff0: 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ,p);.    if( pOl
d000: 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
d010: 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
d020: 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
d030: 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
d040: 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
d050: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
d060: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
d070: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
d080: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
d090: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
d0a0: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
d0b0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
d0c0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d0d0: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
d0e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
d0f0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
d100: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d110: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
d120: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
d130: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
d140: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
d150: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
d160: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
d170: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
d180: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
d190: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
d1a0: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
d1b0: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
d1c0: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
d1d0: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
d1e0: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
d1f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
d200: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
d210: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
d220: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
d230: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d240: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
d250: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
d260: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
d270: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
d280: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
d290: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
d2a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
d2b0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
d2c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d2d0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
d2e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
d2f0: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
d300: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
d310: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
d320: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
d330: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
d340: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
d350: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
d360: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
d370: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
d380: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
d390: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
d3a0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d3b0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
d3c0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
d3d0: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
d3e0: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
d3f0: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
d400: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
d410: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
d420: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
d430: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
d440: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
d450: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
d460: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
d470: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
d480: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
d490: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
d4a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
d4b0: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
d4c0: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
d4d0: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e  ken *pName;.  in
d4e0: 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
d4f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d500: 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
d510: 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
d520: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d530: 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
d540: 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
d550: 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
d560: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d570: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
d580: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
d590: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
d5a0: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
d5b0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
d5c0: 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
d5d0: 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
d5e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
d5f0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
d600: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
d610: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
d620: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
d630: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
d640: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77  .  }.  sqlite3Tw
d650: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
d660: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
d670: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
d680: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
d690: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
d6a0: 53 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73  Schema);.  if( s
d6b0: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
d6c0: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
d6d0: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
d6e0: 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46  .    && sqlite3F
d6f0: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
d700: 70 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20  pSelect).  ){.  
d710: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d720: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d730: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
d740: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
d750: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
d760: 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
d770: 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
d780: 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
d790: 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
d7a0: 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
d7b0: 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
d7c0: 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
d7d0: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
d7e0: 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
d7f0: 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
d800: 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
d810: 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
d820: 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
d830: 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
d840: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
d850: 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
d860: 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
d870: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
d880: 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
d890: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
d8a0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d8b0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d8c0: 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
d8d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
d8e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
d8f0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
d900: 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sy ){.    sqlite
d910: 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
d920: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
d930: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
d940: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d950: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
d960: 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
d970: 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
d980: 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
d990: 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
d9a0: 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
d9b0: 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30   ALWAYS(sEnd.z[0
d9c0: 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b  ]!=0) && sEnd.z[
d9d0: 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
d9e0: 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
d9f0: 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
da00: 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
da10: 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
da20: 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  z);.  z = pBegin
da30: 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  ->z;.  while( AL
da40: 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c  WAYS(n>0) && sql
da50: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
da60: 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
da70: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
da80: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
da90: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
daa0: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
dab0: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
dac0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
dad0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
dae0: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
daf0: 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29  se, 0, &sEnd, 0)
db00: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
db10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
db20: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
db30: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
db40: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
db50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
db60: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
db70: 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
db80: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
db90: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
dba0: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
dbb0: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
dbc0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
dbd0: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
dbe0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
dbf0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
dc00: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
dc10: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
dc20: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
dc30: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
dc40: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
dc50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
dc60: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
dc70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
dc80: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
dc90: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
dca0: 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
dcb0: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
dcc0: 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
dcd0: 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
dce0: 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
dcf0: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
dd00: 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
dd10: 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
dd20: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
dd30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
dd40: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
dd50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
dd70: 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
dd80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
dd90: 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
dda0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ddb0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
ddc0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
ddd0: 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
dde0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28  rrors */.  int (
ddf0: 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e  *xAuth)(void*,in
de00: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  t,const char*,co
de10: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
de20: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
de30: 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *);..  assert( p
de40: 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
de50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
de60: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
de70: 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
de80: 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
de90: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
dea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
deb0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
dec0: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
ded0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
dee0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
def0: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
df00: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
df10: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
df20: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
df30: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
df40: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
df50: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
df60: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
df70: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
df80: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
df90: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
dfa0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
dfb0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
dfc0: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
dfd0: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
dfe0: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
dff0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
e000: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
e010: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
e020: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
e030: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
e040: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
e050: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
e060: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
e070: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
e080: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
e090: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
e0a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
e0b0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
e0c0: 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20  ally, the error 
e0d0: 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75  above is now cau
e0e0: 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
e0f0: 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  ching this point
e100: 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66  ..  ** But the f
e110: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73  ollowing test is
e120: 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74   still important
e130: 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65   as it does come
e140: 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20   up.  ** in the 
e150: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20  following:.  ** 
e160: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
e170: 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28   TABLE main.ex1(
e180: 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  a);.  **     CRE
e190: 41 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78  ATE TEMP VIEW ex
e1a0: 31 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52  1 AS SELECT a FR
e1b0: 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20  OM ex1;.  **    
e1c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e1d0: 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20  emp.ex1;.  */.  
e1e0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
e1f0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
e200: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e210: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
e220: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
e230: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
e240: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
e250: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e260: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
e270: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
e280: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
e290: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
e2a0: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
e2b0: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
e2c0: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
e2d0: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
e2e0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
e2f0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
e300: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
e310: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
e320: 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
e330: 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
e340: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
e350: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
e360: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
e370: 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
e380: 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
e390: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
e3a0: 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
e3b0: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
e3c0: 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
e3d0: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
e3e0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
e3f0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
e400: 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
e410: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
e420: 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
e430: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
e440: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
e450: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
e460: 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61  el ){.    u8 ena
e470: 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64  bleLookaside = d
e480: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e490: 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70  abled;.    n = p
e4a0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
e4b0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
e4c0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
e4d0: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
e4e0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
e4f0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d  ol = -1;.    db-
e500: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e510: 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  led = 0;.#ifndef
e520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e530: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
e540: 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
e550: 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
e560: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
e570: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
e580: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
e590: 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
e5a0: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
e5b0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    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 23 65  Parse, pSel);.#e
e5f0: 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  ndif.    db->loo
e600: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
e610: 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  = enableLookasid
e620: 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e;.    pParse->n
e630: 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28  Tab = n;.    if(
e640: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
e650: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
e660: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
e670: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
e680: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
e690: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
e6a0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
e6b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
e6c0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
e6d0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
e6e0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
e6f0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
e700: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
e710: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
e720: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
e730: 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65  ld(db, 0, pTable
e740: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
e750: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
e760: 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42  ema->flags |= DB
e770: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20  _UnresetViews;. 
e780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e790: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30  pTable->nCol = 0
e7a0: 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  ;.      nErr++;.
e7b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e7c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
e7d0: 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73  , pSel);.  } els
e7e0: 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a  e {.    nErr++;.
e7f0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
e800: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
e810: 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  /.  return nErr;
e820: 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21    .}.#endif /* !
e830: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e840: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
e850: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e860: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
e870: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e880: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
e890: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c  ** Clear the col
e8a0: 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65  umn names from e
e8b0: 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74  very VIEW in dat
e8c0: 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74  abase idx..*/.st
e8d0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
e8e0: 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c  ViewResetAll(sql
e8f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64  ite3 *db, int id
e900: 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  x){.  HashElem *
e910: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
e920: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
e930: 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20  eld(db, idx, 0) 
e940: 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50  );.  if( !DbHasP
e950: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
e960: 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
e970: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  ) ) return;.  fo
e980: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
e990: 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78  rst(&db->aDb[idx
e9a0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
e9b0: 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48  sh); i;i=sqliteH
e9c0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
e9d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73   Table *pTab = s
e9e0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
e9f0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
ea00: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
ea10: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c   sqliteDeleteCol
ea20: 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
ea30: 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  b);.      pTab->
ea40: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
ea50: 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  pTab->nCol = 0;.
ea60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
ea70: 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
ea80: 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
ea90: 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
eaa0: 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
eab0: 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
eac0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ead0: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
eae0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
eaf0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
eb00: 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
eb10: 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
eb20: 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
eb30: 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
eb40: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
eb50: 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
eb60: 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
eb70: 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
eb80: 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
eb90: 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
eba0: 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
ebb0: 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
ebc0: 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
ebd0: 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
ebe0: 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
ebf0: 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
ec00: 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
ec10: 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
ec20: 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
ec30: 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
ec40: 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
ec50: 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
ec60: 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
ec70: 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
ec80: 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
ec90: 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
eca0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
ecb0: 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
ecc0: 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
ecd0: 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
ece0: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
ecf0: 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
ed00: 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
ed10: 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
ed20: 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
ed30: 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
ed40: 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
ed50: 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
ed60: 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
ed70: 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
ed80: 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
ed90: 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
eda0: 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
edb0: 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
edc0: 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
edd0: 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
ede0: 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
edf0: 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
ee00: 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
ee10: 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
ee20: 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
ee30: 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
ee40: 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
ee50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ee60: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
ee70: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
ee80: 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33  ageMoved(sqlite3
ee90: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
eea0: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
eeb0: 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
eec0: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
eed0: 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b  Hash;.  Db *pDb;
eee0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
eef0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
ef00: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
ef10: 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
ef20: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68  Db[iDb];.  pHash
ef30: 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
ef40: 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
ef50: 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
ef60: 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
ef70: 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
ef80: 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
ef90: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
efa0: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
efb0: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
efc0: 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
efd0: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
efe0: 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
eff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
f000: 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
f010: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
f020: 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
f030: 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
f040: 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
f050: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
f060: 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
f070: 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
f080: 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
f090: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
f0a0: 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
f0b0: 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
f0c0: 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
f0d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
f0e0: 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
f0f0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
f100: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
f110: 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
f120: 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
f130: 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
f140: 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
f150: 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
f160: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
f170: 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
f180: 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
f190: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
f1a0: 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
f1b0: 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
f1c0: 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
f1d0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
f1e0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
f1f0: 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
f200: 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
f210: 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
f220: 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
f230: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
f240: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
f250: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f260: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
f270: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f280: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
f290: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f2a0: 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
f2b0: 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
f2c0: 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
f2d0: 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
f2e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f2f0: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
f300: 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
f310: 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
f320: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
f330: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
f340: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
f350: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
f360: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
f370: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
f380: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
f390: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
f3a0: 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
f3b0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
f3c0: 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
f3d0: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
f3e0: 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
f3f0: 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
f400: 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
f410: 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
f420: 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
f430: 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
f440: 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
f450: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f460: 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
f470: 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
f480: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
f490: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
f4a0: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
f4b0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
f4c0: 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
f4d0: 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
f4e0: 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
f4f0: 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
f500: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
f510: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
f520: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
f530: 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
f540: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
f550: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f560: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
f570: 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
f580: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
f590: 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
f5a0: 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
f5b0: 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
f5c0: 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
f5d0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f5e0: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
f5f0: 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
f600: 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
f610: 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
f620: 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
f630: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
f640: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
f650: 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
f660: 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
f670: 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
f680: 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
f690: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
f6a0: 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
f6b0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
f6c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
f6d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f6e0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
f6f0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
f700: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
f710: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
f720: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
f730: 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
f740: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f750: 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
f760: 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
f770: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
f780: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
f790: 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
f7a0: 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
f7b0: 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
f7c0: 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
f7d0: 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
f7e0: 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
f7f0: 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
f800: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
f810: 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
f820: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
f830: 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
f840: 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
f850: 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
f860: 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
f870: 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
f880: 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
f890: 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
f8a0: 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
f8b0: 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
f8c0: 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
f8d0: 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
f8e0: 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
f8f0: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
f900: 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
f910: 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
f920: 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
f930: 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
f940: 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
f950: 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
f960: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
f970: 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
f980: 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
f990: 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
f9a0: 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
f9b0: 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
f9c0: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
f9d0: 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
f9e0: 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
f9f0: 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
fa00: 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
fa10: 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
fa20: 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
fa30: 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
fa40: 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
fa50: 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
fa60: 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
fa70: 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
fa80: 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
fa90: 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
faa0: 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
fab0: 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
fac0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
fad0: 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
fae0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
faf0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
fb00: 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
fb10: 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
fb20: 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
fb30: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
fb40: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
fb50: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
fb60: 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
fb70: 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
fb80: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
fb90: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
fba0: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
fbb0: 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
fbc0: 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
fbd0: 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
fbe0: 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
fbf0: 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
fc00: 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
fc10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
fc20: 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
fc30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
fc40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
fc50: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
fc60: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
fc70: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
fc80: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65 73  hema);.      des
fc90: 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
fca0: 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69  rse, iLargest, i
fcb0: 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74  Db);.      iDest
fcc0: 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74  royed = iLargest
fcd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
fce0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  if.}../*.** Remo
fcf0: 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
fd00: 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
fd10: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
fd20: 32 20 74 61 62 6c 65 73 0a 2a 2a 20 61 66 74 65  2 tables.** afte
fd30: 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
fd40: 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
fd50: 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
fd60: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
fd70: 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
fd80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fd90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
fda0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
fdb0: 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
fdc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
fdd0: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
fde0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
fdf0: 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
fe00: 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
fe10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fe20: 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
fe30: 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
fe40: 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ble */.){.  stat
fe50: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
fe60: 7a 53 74 61 74 54 61 62 5b 5d 20 3d 20 7b 20 22  zStatTab[] = { "
fe70: 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 22  sqlite_stat1", "
fe80: 73 71 6c 69 74 65 5f 73 74 61 74 32 22 20 7d 3b  sqlite_stat2" };
fe90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
fea0: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
feb0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
fec0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
fed0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
fee0: 53 69 7a 65 28 61 7a 53 74 61 74 54 61 62 29 3b  Size(azStatTab);
fef0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
ff00: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
ff10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 61 7a 53 74  pParse->db, azSt
ff20: 61 74 54 61 62 5b 69 5d 2c 20 7a 44 62 4e 61 6d  atTab[i], zDbNam
ff30: 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
ff40: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
ff50: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
ff60: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
ff70: 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
ff80: 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
ff90: 20 61 7a 53 74 61 74 54 61 62 5b 69 5d 2c 20 7a   azStatTab[i], z
ffa0: 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Type, zName.    
ffb0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
ffc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ffd0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
ffe0: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
fff0: 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
10000 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
10010 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
10020 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
10030 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
10040 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
10050 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
10060 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
10070 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
10080 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
10090 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
100a0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
100b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
100c0 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
100d0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
100e0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
100f0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
10100 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
10110 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
10120 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
10130 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
10140 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
10150 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20  uppressErr++;.  
10160 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
10170 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
10180 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20 20  , isView, .     
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61 5b         pName->a[
101b0 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
101c0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
101d0 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
101e0 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d  db->suppressErr-
101f0 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -;..  if( pTab==
10200 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
10210 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65  rr ) sqlite3Code
10220 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
10230 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
10240 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
10250 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
10260 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
10270 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
10280 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
10290 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
102a0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
102b0 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
102c0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
102d0 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
102e0 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
102f0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
10300 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
10310 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
10320 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
10330 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
10340 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
10350 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
10360 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
10370 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
10380 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
10390 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
103a0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
103b0 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
103c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
103d0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
103e0 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
103f0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
10400 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
10410 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
10420 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20  *zArg2 = 0;.    
10430 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
10440 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
10450 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
10460 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
10470 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
10480 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
10490 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
104a0 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
104b0 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
104c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
104d0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
104e0 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
104f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
10500 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
10510 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
10520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10530 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10540 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
10550 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
10560 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53  {.      code = S
10570 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
10580 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d  E;.      zArg2 =
10590 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
105a0 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f  e(db, pTab)->pMo
105b0 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66  d->zName;.#endif
105c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
105d0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
105e0 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
105f0 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
10600 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
10610 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
10620 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
10630 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
10640 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
10650 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
10660 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
10670 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d  rse, code, pTab-
10680 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a  >zName, zArg2, z
10690 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
106a0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
106b0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
106c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
106d0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
106e0 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
106f0 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
10700 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
10710 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
10720 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
10730 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
10740 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
10750 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
10760 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
10770 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10780 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
10790 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
107a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
107b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
107c0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
107d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
107e0 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
107f0 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
10800 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
10810 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
10820 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
10830 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
10840 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
10850 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
10860 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
10870 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10880 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
10890 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
108a0 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
108b0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
108c0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
108d0 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
108e0 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
108f0 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
10900 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10910 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
10920 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
10930 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
10940 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
10950 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
10960 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
10970 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
10980 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
10990 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
109a0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
109b0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
109c0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
109d0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
109e0 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 20 2a  ){.    Trigger *
109f0 70 54 72 69 67 67 65 72 3b 0a 20 20 20 20 44 62  pTrigger;.    Db
10a00 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
10a10 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74  [iDb];.    sqlit
10a20 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
10a30 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
10a40 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
10a50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10a60 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
10a70 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10a80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10a90 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10aa0 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
10ab0 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
10ac0 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70  te3FkDropTable(p
10ad0 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54  Parse, pName, pT
10ae0 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  ab);..    /* Dro
10af0 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
10b00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10b10 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
10b20 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20  ropped. Code.   
10b30 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
10b40 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
10b50 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
10b60 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20  aster and/or.   
10b70 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
10b80 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
10b90 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
10ba0 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
10bb0 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
10bc0 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
10bd0 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
10be0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10bf0 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
10c00 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
10c10 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  a || .          
10c20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
10c30 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
10c40 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73  chema );.      s
10c50 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
10c60 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
10c70 69 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70 54  igger);.      pT
10c80 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
10c90 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
10ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10cb0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
10cc0 4e 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  NT.    /* Remove
10cd0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
10ce0 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
10cf0 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
10d00 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  ated with.    **
10d10 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
10d20 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
10d30 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
10d40 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
10d50 65 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65  ed.    ** at the
10d60 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
10d70 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
10d80 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
10d90 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
10da0 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
10db0 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
10dc0 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
10dd0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
10de0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
10df0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
10e00 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
10e10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10e20 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
10e30 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
10e40 45 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69  ETE FROM %s.sqli
10e50 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
10e60 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
10e70 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
10e80 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
10e90 20 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69    );.    }.#endi
10ea0 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61  f..    /* Drop a
10eb0 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
10ec0 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
10ed0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
10ee0 66 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  fer to the.    *
10ef0 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
10f00 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
10f10 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
10f20 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
10f30 65 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72  etes.    ** ever
10f40 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
10f50 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
10f60 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
10f70 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
10f80 20 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54     ** dropped. T
10f90 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
10fa0 6c 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62  led seperately b
10fb0 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
10fc0 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63   can be.    ** c
10fd0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
10fe0 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
10ff0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
11000 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
11010 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
11020 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
11030 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
11040 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44  rse, .        "D
11050 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
11060 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
11070 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
11080 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20  igger'",.       
11090 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
110a0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
110b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
110c0 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
110d0 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
110e0 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61   iDb, "tbl", pTa
110f0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b->zName);.    i
11100 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
11110 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
11120 7b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 54  {.      destroyT
11130 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
11140 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  b);.    }..    /
11150 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
11160 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
11170 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
11180 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
11190 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  y.    ** the sch
111a0 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 20 20  ema cookie..    
111b0 2a 2f 0a 20 20 20 20 69 66 28 20 49 73 56 69 72  */.    if( IsVir
111c0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
111d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
111e0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
111f0 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
11200 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
11210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
11220 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
11230 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
11240 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
11250 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 73  zName, 0);.    s
11260 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
11270 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
11280 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 56 69 65  .  }.  sqliteVie
11290 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
112a0 62 29 3b 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74  b);..exit_drop_t
112b0 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
112c0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
112d0 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
112e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
112f0 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
11300 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
11310 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
11320 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
11330 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
11340 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
11350 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
11360 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
11370 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
11380 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
11390 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
113a0 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
113b0 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
113c0 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
113d0 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
113e0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
113f0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
11400 66 65 72 72 65 64 20 74 6f 2e 20 20 70 54 6f 43  ferred to.  pToC
11410 6f 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ol is a list of 
11420 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6f 74  tables in the ot
11430 68 65 72 0a 2a 2a 20 70 54 6f 20 74 61 62 6c 65  her.** pTo table
11440 20 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67   that the foreig
11450 6e 20 6b 65 79 20 70 6f 69 6e 74 73 20 74 6f 2e  n key points to.
11460 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
11470 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
11480 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
11490 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
114a0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
114b0 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
114c0 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
114d0 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
114e0 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
114f0 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
11500 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
11510 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
11520 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
11530 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
11540 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
11550 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
11560 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
11570 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
11580 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
11590 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
115a0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
115b0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
115c0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
115d0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
115e0 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
115f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
11600 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
11610 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11620 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
11630 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
11640 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
11650 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
11660 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
11670 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
11680 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
11690 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
116a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
116b0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
116c0 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
116d0 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
116e0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
116f0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
11700 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11710 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
11720 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
11730 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
11740 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
11750 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
11760 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
11770 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
11780 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
11790 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
117a0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
117b0 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
117c0 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
117d0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
117e0 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
117f0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
11800 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
11810 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
11820 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
11830 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
11840 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
11850 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
11860 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
11870 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
11880 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
11890 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
118a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
118b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
118c0 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
118d0 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
118e0 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
118f0 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
11900 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
11910 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
11920 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
11930 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
11940 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
11950 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
11960 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
11970 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
11980 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
11990 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
119a0 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
119b0 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
119c0 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
119d0 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
119e0 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
119f0 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
11a00 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
11a10 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
11a20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
11a30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
11a40 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
11a50 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
11a60 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
11a70 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
11a80 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
11a90 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
11aa0 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
11ab0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
11ac0 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
11ad0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
11ae0 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
11af0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
11b00 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
11b10 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
11b20 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
11b30 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
11b40 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
11b50 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
11b60 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
11b70 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
11b80 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
11b90 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
11ba0 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
11bb0 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
11bc0 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
11bd0 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
11be0 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
11bf0 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
11c00 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
11c10 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
11c20 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
11c30 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
11c40 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
11c50 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
11c60 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
11c70 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
11c80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
11c90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
11ca0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
11cb0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
11cc0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
11cd0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
11ce0 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
11cf0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
11d00 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
11d10 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
11d20 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
11d30 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
11d40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11d60 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
11d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
11d80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
11d90 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
11da0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
11db0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
11dc0 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
11dd0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
11de0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
11df0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
11e00 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11e10 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
11e20 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
11e30 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
11e40 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
11e50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
11e60 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
11e70 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
11e80 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
11e90 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
11ea0 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
11eb0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
11ec0 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
11ed0 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
11ee0 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
11ef0 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
11f00 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
11f10 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
11f20 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
11f30 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
11f40 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
11f50 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
11f60 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
11f70 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
11f80 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
11f90 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
11fa0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11fb0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
11fc0 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
11fd0 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
11fe0 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
11ff0 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
12000 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
12010 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71    pFKey->zTo, sq
12020 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 46  lite3Strlen30(pF
12030 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69 64  Key->zTo), (void
12040 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
12050 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
12060 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  ey ){.    db->ma
12070 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
12080 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
12090 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74  .  }.  if( pNext
120a0 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  To ){.    assert
120b0 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76  ( pNextTo->pPrev
120c0 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b  To==0 );.    pFK
120d0 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e  ey->pNextTo = pN
120e0 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74  extTo;.    pNext
120f0 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46  To->pPrevTo = pF
12100 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  Key;.  }..  /* L
12110 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
12120 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
12130 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
12140 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
12150 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
12160 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
12170 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
12180 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
12190 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
121a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
121b0 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
121c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
121d0 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
121e0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
121f0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
12200 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
12210 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12220 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
12230 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
12240 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
12250 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
12260 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
12270 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
12280 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
12290 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
122a0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
122b0 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
122c0 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
122d0 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
122e0 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
122f0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
12300 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
12310 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
12320 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
12330 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
12340 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
12350 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
12360 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12370 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
12380 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12390 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
123a0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
123b0 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
123c0 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
123d0 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
123e0 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
123f0 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
12400 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
12410 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
12420 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
12430 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33  ; /* EV: R-30323
12440 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65  -21917 */.  pFKe
12450 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
12460 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a  (u8)isDeferred;.
12470 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12480 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
12490 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
124a0 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
124b0 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
124c0 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
124d0 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
124e0 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
124f0 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
12500 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
12510 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
12520 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
12530 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
12540 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
12550 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
12560 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
12570 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
12580 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
12590 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69  register specifi
125a0 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
125b0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
125c0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
125d0 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
125e0 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
125f0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
12600 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
12610 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
12620 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
12630 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
12640 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
12650 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
12660 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
12670 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
12680 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
12690 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
126a0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
126b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
126c0 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
126d0 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
126e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
126f0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
12700 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
12710 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
12720 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
12730 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
12740 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
12750 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
12760 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
12770 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
12780 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
12790 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
127a0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  dex */.  int iSo
127b0 72 74 65 72 20 3d 20 69 54 61 62 3b 20 20 20 20  rter = iTab;    
127c0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
127d0 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e  r opened by Open
127e0 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73  Sorter (if in us
127f0 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  e) */.  int addr
12800 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
12810 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12820 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
12830 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
12860 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
12870 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12890 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
128a0 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61  into this virtua
128b0 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b  l machine */.  K
128c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20  eyInfo *pKey;   
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
128e0 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64   KeyInfo for ind
128f0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49  ex */.  int regI
12900 64 78 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  dxKey;          
12910 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
12920 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ers containing t
12930 68 65 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  he index key */.
12940 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12960 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
12970 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20  ding assemblied 
12980 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
12990 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
129a0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
129b0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
129c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
129d0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
129e0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
129f0 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
12a00 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ema);..  /* Set 
12a10 62 55 73 65 53 6f 72 74 65 72 20 74 6f 20 75 73  bUseSorter to us
12a20 65 20 4f 50 5f 4f 70 65 6e 53 6f 72 74 65 72 2c  e OP_OpenSorter,
12a30 20 6f 72 20 63 6c 65 61 72 20 69 74 20 74 6f 20   or clear it to 
12a40 69 6e 73 65 72 74 20 64 69 72 65 63 74 6c 79 20  insert directly 
12a50 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 69  .  ** into the i
12a60 6e 64 65 78 2e 20 54 68 65 20 73 6f 72 74 65 72  ndex. The sorter
12a70 20 69 73 20 75 73 65 64 20 75 6e 6c 65 73 73 20   is used unless 
12a80 65 69 74 68 65 72 20 4f 4d 49 54 5f 4d 45 52 47  either OMIT_MERG
12a90 45 5f 53 4f 52 54 20 69 73 0a 20 20 2a 2a 20 64  E_SORT is.  ** d
12aa0 65 66 69 6e 65 64 20 6f 72 20 74 68 65 20 73 79  efined or the sy
12ab0 73 74 65 6d 20 69 73 20 63 6f 6e 66 69 67 75 72  stem is configur
12ac0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 65 6d 70  ed to store temp
12ad0 20 66 69 6c 65 73 20 69 6e 2d 6d 65 6d 6f 72 79   files in-memory
12ae0 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
12af0 54 45 5f 4f 4d 49 54 5f 4d 45 52 47 45 5f 53 4f  TE_OMIT_MERGE_SO
12b00 52 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  RT.  static cons
12b10 74 20 69 6e 74 20 62 55 73 65 53 6f 72 74 65 72  t int bUseSorter
12b20 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
12b30 6e 73 74 20 69 6e 74 20 62 55 73 65 53 6f 72 74  nst int bUseSort
12b40 65 72 20 3d 20 21 73 71 6c 69 74 65 33 54 65 6d  er = !sqlite3Tem
12b50 70 49 6e 4d 65 6d 6f 72 79 28 70 50 61 72 73 65  pInMemory(pParse
12b60 2d 3e 64 62 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  ->db);.#endif..#
12b70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12b80 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
12b90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
12ba0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
12bb0 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
12bc0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
12bd0 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
12be0 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a  iDb].zName ) ){.
12bf0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
12c00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71  #endif..  /* Req
12c10 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
12c20 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  k on the table t
12c30 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f  o perform this o
12c40 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  peration */.  sq
12c50 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
12c60 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
12c70 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d  ->tnum, 1, pTab-
12c80 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20  >zName);..  v = 
12c90 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12ca0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
12cb0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
12cc0 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  f( memRootPage>=
12cd0 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  0 ){.    tnum = 
12ce0 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d  memRootPage;.  }
12cf0 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  else{.    tnum =
12d00 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20   pIndex->tnum;. 
12d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12d20 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72  dOp2(v, OP_Clear
12d30 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  , tnum, iDb);.  
12d40 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
12d50 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70  e3IndexKeyinfo(p
12d60 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
12d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12d80 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
12d90 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
12da0 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20   iDb, .         
12db0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
12dc0 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49   *)pKey, P4_KEYI
12dd0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
12de0 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
12df0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12e00 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12e10 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f   1);.  }..  /* O
12e20 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
12e30 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
12e40 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
12e50 20 69 66 28 20 62 55 73 65 53 6f 72 74 65 72 20   if( bUseSorter 
12e60 29 7b 0a 20 20 20 20 69 53 6f 72 74 65 72 20 3d  ){.    iSorter =
12e70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12e80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e90 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
12ea0 6e 53 6f 72 74 65 72 2c 20 69 53 6f 72 74 65 72  nSorter, iSorter
12eb0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 70  , 0, 0, (char*)p
12ec0 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  Key, P4_KEYINFO)
12ed0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
12ee0 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70   the table. Loop
12ef0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77   through all row
12f00 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  s of the table, 
12f10 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a  inserting index.
12f20 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74    ** records int
12f30 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  o the sorter. */
12f40 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
12f50 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
12f60 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
12f70 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
12f80 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
12f90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
12fa0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
12fb0 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
12fc0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
12fd0 50 61 72 73 65 29 3b 0a 20 20 72 65 67 49 64 78  Parse);.  regIdx
12fe0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 6e  Key = sqlite3Gen
12ff0 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
13000 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 54  arse, pIndex, iT
13010 61 62 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31  ab, regRecord, 1
13020 29 3b 0a 0a 20 20 69 66 28 20 62 55 73 65 53 6f  );..  if( bUseSo
13030 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rter ){.    sqli
13040 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13050 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
13060 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
13070 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
13080 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13090 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
130a0 31 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  1+1);.    sqlite
130b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
130c0 20 61 64 64 72 31 29 3b 0a 20 20 20 20 61 64 64   addr1);.    add
130d0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
130e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
130f0 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 0a  t, iSorter, 0);.
13100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13110 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b  ddOp2(v, OP_RowK
13120 65 79 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  ey, iSorter, reg
13130 52 65 63 6f 72 64 29 3b 0a 20 20 7d 0a 0a 20 20  Record);.  }..  
13140 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
13150 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
13160 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 72 65      const int re
13170 67 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b  gRowid = regIdxK
13180 65 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  ey + pIndex->nCo
13190 6c 75 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20  lumn;.    const 
131a0 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33  int j2 = sqlite3
131b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
131c0 76 29 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64  v) + 2;.    void
131d0 20 2a 20 63 6f 6e 73 74 20 70 52 65 67 4b 65 79   * const pRegKey
131e0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f   = SQLITE_INT_TO
131f0 5f 50 54 52 28 72 65 67 49 64 78 4b 65 79 29 3b  _PTR(regIdxKey);
13200 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 67  ..    /* The reg
13210 69 73 74 65 72 73 20 61 63 63 65 73 73 65 64 20  isters accessed 
13220 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71  by the OP_IsUniq
13230 75 65 20 6f 70 63 6f 64 65 20 77 65 72 65 20 61  ue opcode were a
13240 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
13250 75 73 69 6e 67 20 73 71 6c 69 74 65 33 47 65 74  using sqlite3Get
13260 54 65 6d 70 52 61 6e 67 65 28 29 20 69 6e 73 69  TempRange() insi
13270 64 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  de of the sqlite
13280 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65  3GenerateIndexKe
13290 79 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  y().    ** call 
132a0 61 62 6f 76 65 2e 20 4a 75 73 74 20 62 65 66 6f  above. Just befo
132b0 72 65 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  re that function
132c0 20 77 61 73 20 66 72 65 65 64 20 74 68 65 79 20   was freed they 
132d0 77 65 72 65 20 72 65 6c 65 61 73 65 64 0a 20 20  were released.  
132e0 20 20 2a 2a 20 28 6d 61 64 65 20 61 76 61 69 6c    ** (made avail
132f0 61 62 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d 70  able to the comp
13300 69 6c 65 72 20 66 6f 72 20 72 65 75 73 65 29 20  iler for reuse) 
13310 75 73 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71  using .    ** sq
13320 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
13330 52 61 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20 73  Range(). So in s
13340 6f 6d 65 20 77 61 79 73 20 68 61 76 69 6e 67 20  ome ways having 
13350 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a  the OP_IsUnique.
13360 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73      ** opcode us
13370 65 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  e the values sto
13380 72 65 64 20 77 69 74 68 69 6e 20 73 65 65 6d 73  red within seems
13390 20 64 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65   dangerous. Howe
133a0 76 65 72 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a  ver, since.    *
133b0 2a 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65  * we can be sure
133c0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 74   that no other t
133d0 65 6d 70 20 72 65 67 69 73 74 65 72 73 20 68 61  emp registers ha
133e0 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
133f0 64 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 73  d.    ** since s
13400 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
13410 70 52 61 6e 67 65 28 29 20 77 61 73 20 63 61 6c  pRange() was cal
13420 6c 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  led, it is safe 
13430 74 6f 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f  to do so..    */
13440 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13450 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55  AddOp4(v, OP_IsU
13460 6e 69 71 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c  nique, iIdx, j2,
13470 20 72 65 67 52 6f 77 69 64 2c 20 70 52 65 67 4b   regRowid, pRegK
13480 65 79 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  ey, P4_INT32);. 
13490 20 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f     sqlite3HaltCo
134a0 6e 73 74 72 61 69 6e 74 28 0a 20 20 20 20 20 20  nstraint(.      
134b0 20 20 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f    pParse, OE_Abo
134c0 72 74 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  rt, "indexed col
134d0 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
134e0 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29  que", P4_STATIC)
134f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13500 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13510 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
13520 20 72 65 67 52 65 63 6f 72 64 2c 20 62 55 73 65   regRecord, bUse
13530 53 6f 72 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Sorter);.  sqlit
13540 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
13550 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
13560 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
13570 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
13580 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
13590 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
135a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
135b0 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64  ext, iSorter, ad
135c0 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
135d0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
135e0 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69   addr1);..  sqli
135f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13600 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29   OP_Close, iTab)
13610 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13620 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
13630 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  e, iIdx);.  sqli
13640 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13650 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74   OP_Close, iSort
13660 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  er);.}../*.** Cr
13670 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
13680 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
13690 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
136a0 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
136b0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
136c0 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
136d0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
136e0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
136f0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
13700 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
13710 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
13720 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
13730 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
13740 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
13750 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
13760 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
13770 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
13780 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
13790 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
137a0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
137b0 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
137c0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
137d0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
137e0 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
137f0 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
13800 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
13810 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
13820 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
13830 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
13840 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
13850 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
13860 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
13870 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
13880 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
13890 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
138a0 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
138b0 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
138c0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
138d0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
138e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64  **.** If the ind
138f0 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75  ex is created su
13900 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75  ccessfully, retu
13910 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
13920 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a  the new Index.**
13930 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73   structure. This
13940 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
13950 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
13960 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69  () to mark the i
13970 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74  ndex.** as the t
13980 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
13990 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49 6e 64  y (Index.autoInd
139a0 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78  ex==2)..*/.Index
139b0 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49   *sqlite3CreateI
139c0 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
139d0 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c  Parse,     /* Al
139e0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
139f0 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
13a00 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
13a10 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  1,     /* First 
13a20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
13a30 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
13a40 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
13a50 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  e2,     /* Secon
13a60 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
13a70 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
13a80 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
13a90 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62  pTblName, /* Tab
13aa0 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
13ab0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
13ac0 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
13ad0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
13ae0 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
13af0 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
13b00 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
13b10 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45  ror,       /* OE
13b20 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
13b30 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
13b40 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
13b50 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
13b60 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
13b70 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
13b80 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  s this statement
13b90 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
13ba0 64 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d,       /* The 
13bb0 22 29 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20  ")" that closes 
13bc0 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
13bd0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13be0 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
13bf0 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
13c00 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
13c10 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
13c20 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
13c30 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74  xist     /* Omit
13c40 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
13c50 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
13c60 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52  /.){.  Index *pR
13c70 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50  et = 0;     /* P
13c80 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e  ointer to return
13c90 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
13ca0 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
13cb0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
13cc0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
13cd0 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
13ce0 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
13cf0 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
13d00 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
13d10 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13d20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
13d30 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
13d40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
13d50 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
13d60 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
13d70 20 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20    Token nullId; 
13d80 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74         /* Fake t
13d90 6f 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74  oken for an empt
13da0 79 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44  y ID list */.  D
13db0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
13dc0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
13dd0 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
13de0 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
13df0 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
13e00 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
13e10 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
13e20 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
13e30 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
13e40 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
13e50 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
13e60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13e70 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
13e80 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
13e90 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
13ea0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
13eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
13ec0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
13ed0 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
13ee0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
13ef0 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
13f00 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
13f10 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
13f20 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
13f30 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
13f40 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
13f50 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
13f60 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
13f70 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e    int nCol;.  in
13f80 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
13f90 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20  char *zExtra;.. 
13fa0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d   assert( pStart=
13fb0 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 20 29 3b  =0 || pEnd!=0 );
13fc0 20 2f 2a 20 70 45 6e 64 20 6d 75 73 74 20 62 65   /* pEnd must be
13fd0 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 70 53 74   non-NULL if pSt
13fe0 61 72 74 20 69 73 20 2a 2f 0a 20 20 61 73 73 65  art is */.  asse
13ff0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
14000 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
14010 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
14020 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
14030 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
14040 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45  cFailed || IN_DE
14050 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
14060 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14070 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
14080 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
14090 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
140a0 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
140b0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
140c0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
140d0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
140e0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
140f0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
14100 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
14110 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
14120 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
14130 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
14140 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
14150 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
14160 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
14170 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
14180 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
14190 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
141a0 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
141b0 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
141c0 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
141d0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
141e0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
141f0 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
14200 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
14210 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
14220 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
14230 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
14240 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
14250 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14260 78 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  x;..#ifndef SQLI
14270 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
14280 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
14290 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
142a0 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
142b0 66 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a  f the the table.
142c0 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
142d0 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
142e0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
142f0 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
14300 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
14310 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
14320 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
14330 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
14340 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
14350 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
14360 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
14370 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
14380 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
14390 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
143a0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
143b0 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
143c0 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
143d0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
143e0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
143f0 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  f..    if( sqlit
14400 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
14410 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
14420 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26  ndex", pName) &&
14430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14440 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
14450 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20  , pTblName).    
14460 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
14470 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
14480 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
14490 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
144a0 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
144b0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
144c0 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
144d0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
144e0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
144f0 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
14500 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
14510 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c 4e  pParse, 0, pTblN
14520 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
14530 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61   .        pTblNa
14540 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
14550 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
14560 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ab || db->malloc
14570 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  Failed ) goto ex
14580 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
14590 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
145a0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
145b0 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
145c0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
145d0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
145e0 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
145f0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
14600 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
14610 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
14620 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
14630 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
14640 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
14650 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
14660 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
14670 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65  Db[iDb];..  asse
14680 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
14690 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
146a0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66  >nErr==0 );.  if
146b0 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
146c0 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
146d0 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
146e0 0a 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  .       && memcm
146f0 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
14700 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
14710 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
14720 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14730 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
14740 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
14750 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14760 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
14770 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
14780 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14790 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
147a0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
147b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
147c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
147d0 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
147e0 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
147f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14800 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
14810 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14820 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14830 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
14840 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
14850 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14860 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
14870 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
14880 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
14890 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
148a0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
148b0 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
148c0 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
148d0 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
148e0 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
148f0 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
14900 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
14910 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
14920 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
14930 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
14940 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
14950 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
14960 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
14970 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
14980 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
14990 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
149a0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
149b0 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
149c0 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
149d0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
149e0 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
149f0 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
14a00 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14a10 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
14a20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
14a30 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
14a40 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
14a50 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
14a60 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
14a70 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
14a80 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
14a90 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
14aa0 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
14ab0 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
14ac0 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
14ad0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
14ae0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
14af0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
14b00 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
14b10 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
14b20 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
14b30 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14b40 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
14b50 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
14b60 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
14b70 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
14b80 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14b90 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14ba0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
14bb0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
14bc0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
14bd0 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
14be0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
14bf0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14c00 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
14c10 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
14c20 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
14c30 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
14c40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14c50 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
14c60 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
14c70 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
14c80 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61   zName, pDb->zNa
14c90 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
14ca0 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
14cb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14cc0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14cd0 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
14ce0 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
14cf0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
14d00 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
14d10 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
14d20 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
14d30 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
14d40 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
14d50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14d60 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14d70 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
14d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
14d90 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
14da0 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
14db0 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
14dc0 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
14dd0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
14de0 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d   n++){}.    zNam
14df0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
14e00 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61  tf(db, "sqlite_a
14e10 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c  utoindex_%s_%d",
14e20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29   pTab->zName, n)
14e30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
14e40 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
14e50 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14e60 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ex;.    }.  }.. 
14e70 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
14e80 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
14e90 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
14ea0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
14eb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
14ec0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
14ed0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
14ee0 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   pDb->zName;.   
14ef0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
14f00 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
14f10 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
14f20 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
14f30 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
14f40 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14f50 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
14f60 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
14f70 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
14f80 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
14f90 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
14fa0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
14fb0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
14fc0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14fd0 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
14fe0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
14ff0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
15000 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
15010 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
15020 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15030 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
15040 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
15050 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
15060 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
15070 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
15080 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
15090 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
150a0 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
150b0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
150c0 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
150d0 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
150e0 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
150f0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  List==0 ){.    n
15100 75 6c 6c 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e  ullId.z = pTab->
15110 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
15120 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75  1].zName;.    nu
15130 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c 69 74 65 33  llId.n = sqlite3
15140 53 74 72 6c 65 6e 33 30 28 28 63 68 61 72 2a 29  Strlen30((char*)
15150 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
15160 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
15170 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
15180 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rse, 0, 0);.    
15190 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67  if( pList==0 ) g
151a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
151b0 69 6e 64 65 78 3b 0a 20 20 20 20 73 71 6c 69 74  index;.    sqlit
151c0 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
151d0 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  e(pParse, pList,
151e0 20 26 6e 75 6c 6c 49 64 2c 20 30 29 3b 0a 20 20   &nullId, 0);.  
151f0 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
15200 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f  rtOrder = (u8)so
15210 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
15220 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
15230 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
15240 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
15250 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
15260 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
15270 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
15280 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
15290 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
152a0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
152b0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
152c0 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
152d0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
152e0 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
152f0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
15300 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
15310 0a 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72  .      /* Either
15320 20 70 43 6f 6c 6c 21 3d 30 20 6f 72 20 74 68 65   pColl!=0 or the
15330 72 65 20 77 61 73 20 61 6e 20 4f 4f 4d 20 66 61  re was an OOM fa
15340 69 6c 75 72 65 2e 20 20 42 75 74 20 69 66 20 61  ilure.  But if a
15350 6e 20 4f 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 66  n OOM.      ** f
15360 61 69 6c 75 72 65 20 77 65 20 68 61 76 65 20 71  ailure we have q
15370 75 69 74 20 62 65 66 6f 72 65 20 72 65 61 63 68  uit before reach
15380 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 20  ing this point. 
15390 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
153a0 41 59 53 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20  AYS(pColl) ){.  
153b0 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
153c0 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
153d0 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  en30(pColl->zNam
153e0 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
153f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20   }.  }..  /* .  
15400 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  ** Allocate the 
15410 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  index structure.
15420 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d   .  */.  nName =
15430 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15440 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20  (zName);.  nCol 
15450 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
15460 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
15470 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
15480 62 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  b, .      sizeof
15490 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20  (Index) +       
154a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
154b0 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20  structure  */.  
154c0 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
154d0 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
154e0 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
154f0 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  mn   */.      si
15500 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b  zeof(int)*(nCol+
15510 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e  1) +       /* In
15520 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a  dex.aiRowEst   *
15530 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63  /.      sizeof(c
15540 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20  har *)*nCol +   
15550 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
15560 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
15570 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f    sizeof(u8)*nCo
15580 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
15590 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
155a0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d  er */.      nNam
155b0 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20  e + 1 +         
155c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
155d0 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a  x.zName      */.
155e0 20 20 20 20 20 20 6e 45 78 74 72 61 20 20 20 20        nExtra    
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
15610 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a  sequence names *
15620 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  /.  );.  if( db-
15630 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
15640 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
15650 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
15660 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  .  pIndex->azCol
15670 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49  l = (char**)(&pI
15680 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64  ndex[1]);.  pInd
15690 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  ex->aiColumn = (
156a0 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  int *)(&pIndex->
156b0 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20  azColl[nCol]);. 
156c0 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73   pIndex->aiRowEs
156d0 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29  t = (unsigned *)
156e0 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  (&pIndex->aiColu
156f0 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  mn[nCol]);.  pIn
15700 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  dex->aSortOrder 
15710 3d 20 28 75 38 20 2a 29 28 26 70 49 6e 64 65 78  = (u8 *)(&pIndex
15720 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b  ->aiRowEst[nCol+
15730 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  1]);.  pIndex->z
15740 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28  Name = (char *)(
15750 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72  &pIndex->aSortOr
15760 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45  der[nCol]);.  zE
15770 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28  xtra = (char *)(
15780 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e  &pIndex->zName[n
15790 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63  Name+1]);.  memc
157a0 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
157b0 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
157c0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
157d0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
157e0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  ndex->nColumn = 
157f0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
15800 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
15810 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
15820 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64   pIndex->autoInd
15830 65 78 20 3d 20 28 75 38 29 28 70 4e 61 6d 65 3d  ex = (u8)(pName=
15840 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  =0);.  pIndex->p
15850 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
15860 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
15870 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15880 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
15890 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a  db, iDb, 0) );..
158a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
158b0 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68  e if we should h
158c0 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73  onor DESC reques
158d0 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75  ts on index colu
158e0 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
158f0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
15900 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20  e_format>=4 ){. 
15910 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
15920 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f   = -1;   /* Hono
15930 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73  r DESC */.  }els
15940 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  e{.    sortOrder
15950 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Mask = 0;    /* 
15960 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20  Ignore DESC */. 
15970 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68   }..  /* Scan th
15980 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  e names of the c
15990 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
159a0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
159b0 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20  d and.  ** load 
159c0 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63  the column indic
159d0 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65  es into the Inde
159e0 78 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  x structure.  Re
159f0 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20  port an error.  
15a00 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e  ** if any column
15a10 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   is not found.. 
15a20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 20   **.  ** TODO:  
15a30 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d 61  Add a test to ma
15a40 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
15a50 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
15a60 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a 2a 20 6d  not named.  ** m
15a70 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77 69  ore than once wi
15a80 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 69 6e  thin the same in
15a90 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  dex.  Only the f
15aa0 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20 6f 66  irst instance of
15ab0 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  .  ** the column
15ac0 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73   will ever be us
15ad0 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69  ed by the optimi
15ae0 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  zer.  Note that 
15af0 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73  using the.  ** s
15b00 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20  ame column more 
15b10 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74  than once cannot
15b20 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63   be an error bec
15b30 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
15b40 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b  .  ** break back
15b50 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
15b60 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74  ity - it needs t
15b70 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a  o be a warning..
15b80 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
15b90 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d  pListItem=pList-
15ba0 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  >a; i<pList->nEx
15bb0 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74  pr; i++, pListIt
15bc0 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74  em++){.    const
15bd0 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20   char *zColName 
15be0 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61  = pListItem->zNa
15bf0 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  me;.    Column *
15c00 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  pTabCol;.    int
15c10 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
15c20 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  der;.    char *z
15c30 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
15c40 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
15c50 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
15c60 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a  me */..    for(j
15c70 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  =0, pTabCol=pTab
15c80 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
15c90 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43  nCol; j++, pTabC
15ca0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ol++){.      if(
15cb0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
15cc0 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f  zColName, pTabCo
15cd0 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  l->zName)==0 ) b
15ce0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
15cf0 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
15d00 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
15d10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15d20 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
15d30 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
15d40 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
15d50 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e  ab->zName, zColN
15d60 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ame);.      pPar
15d70 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
15d80 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
15d90 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
15da0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
15db0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
15dc0 20 3d 20 6a 3b 0a 20 20 20 20 2f 2a 20 4a 75 73   = j;.    /* Jus
15dd0 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 74 68  tification of th
15de0 65 20 41 4c 57 41 59 53 28 70 4c 69 73 74 49 74  e ALWAYS(pListIt
15df0 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
15e00 29 3a 20 20 42 65 63 61 75 73 65 20 6f 66 0a 20  ):  Because of. 
15e10 20 20 20 2a 2a 20 74 68 65 20 77 61 79 20 74 68     ** the way th
15e20 65 20 22 69 64 78 6c 69 73 74 22 20 6e 6f 6e 2d  e "idxlist" non-
15e30 74 65 72 6d 69 6e 61 6c 20 69 73 20 63 6f 6e 73  terminal is cons
15e40 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
15e50 61 72 73 65 72 2c 0a 20 20 20 20 2a 2a 20 69 66  arser,.    ** if
15e60 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
15e70 72 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68  r is not null th
15e80 65 6e 20 65 69 74 68 65 72 20 70 4c 69 73 74 49  en either pListI
15e90 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
15ea0 6c 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 65 78  l.    ** must ex
15eb0 69 73 74 20 6f 72 20 65 6c 73 65 20 74 68 65 72  ist or else ther
15ec0 65 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  e must have been
15ed0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
15ee0 42 75 74 20 69 66 20 74 68 65 72 65 0a 20 20 20  But if there.   
15ef0 20 2a 2a 20 77 61 73 20 61 6e 20 4f 4f 4d 20 65   ** was an OOM e
15f00 72 72 6f 72 2c 20 77 65 20 77 6f 75 6c 64 20 6e  rror, we would n
15f10 65 76 65 72 20 72 65 61 63 68 20 74 68 69 73 20  ever reach this 
15f20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66  point. */.    if
15f30 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
15f40 70 72 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69  pr && ALWAYS(pLi
15f50 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70  stItem->pExpr->p
15f60 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 69  Coll) ){.      i
15f70 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
15f80 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
15f90 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d  m->pExpr->pColl-
15fa0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43  >zName;.      nC
15fb0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
15fc0 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31  len30(zColl) + 1
15fd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15fe0 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b  nExtra>=nColl );
15ff0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  .      memcpy(zE
16000 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f  xtra, zColl, nCo
16010 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  ll);.      zColl
16020 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
16030 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c   zExtra += nColl
16040 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d  ;.      nExtra -
16050 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  = nColl;.    }el
16060 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  se{.      zColl 
16070 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
16080 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28  zColl;.      if(
16090 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !zColl ){.     
160a0 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     zColl = db->p
160b0 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b  DfltColl->zName;
160c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
160d0 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
160e0 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
160f0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
16100 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
16110 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
16120 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
16130 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
16140 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
16150 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
16160 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
16170 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
16180 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
16190 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
161a0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
161b0 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
161c0 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71 6c  Order;.  }.  sql
161d0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
161e0 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66  t(pIndex);..  if
161f0 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
16200 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
16210 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
16220 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
16230 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
16240 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
16250 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
16260 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
16270 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
16280 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
16290 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
162a0 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
162b0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
162c0 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
162d0 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
162e0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
162f0 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
16300 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
16310 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
16320 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
16330 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
16340 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
16350 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
16360 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
16370 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
16380 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
16390 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
163a0 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
163b0 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
163c0 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
163d0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
163e0 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
163f0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
16400 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
16410 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
16420 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
16430 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
16440 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
16450 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
16460 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
16470 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
16480 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
16490 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
164a0 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
164b0 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
164c0 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
164d0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
164e0 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
164f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
16500 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
16510 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
16520 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
16530 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
16540 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
16550 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
16560 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
16570 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
16580 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
16590 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
165a0 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
165b0 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
165c0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
165d0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
165e0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
165f0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
16600 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
16610 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
16620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16630 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
16640 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61  _None );.      a
16650 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74  ssert( pIdx->aut
16660 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20  oIndex );.      
16670 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
16680 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
16690 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
166a0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49  Idx->nColumn!=pI
166b0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20  ndex->nColumn ) 
166c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
166d0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
166e0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a  >nColumn; k++){.
166f0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
16700 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
16710 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
16720 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
16730 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
16740 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
16750 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
16760 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61      z1 = pIdx->a
16770 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
16780 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61    z2 = pIndex->a
16790 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
167a0 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20    if( z1!=z2 && 
167b0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
167c0 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
167d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
167e0 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( k==pIdx->nColu
167f0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  mn ){.        if
16800 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
16810 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
16820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
16830 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
16840 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
16850 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
16860 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
16870 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
16880 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
16890 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
168a0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
168b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
168c0 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
168d0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
168e0 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
168f0 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
16900 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
16910 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
16920 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
16930 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
16940 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
16950 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
16960 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
16970 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
16980 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
16990 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
169a0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
169b0 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68  behaviour for th
169c0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
169d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
169e0 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
169f0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
16a00 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
16a10 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
16a20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
16a30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16a40 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
16a50 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
16a60 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
16a70 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
16a80 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
16a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
16aa0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
16ab0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
16ad0 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
16ae0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
16af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16b00 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
16b10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
16b20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
16b30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
16b40 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
16b50 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
16b60 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
16b70 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
16b80 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
16b90 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
16ba0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
16bb0 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
16bc0 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
16bd0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
16be0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
16bf0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
16c00 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
16c10 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 49  e3HashInsert(&pI
16c20 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  ndex->pSchema->i
16c30 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20  dxHash, .       
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
16c60 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
16c70 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  0(pIndex->zName)
16c80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16c90 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
16ca0 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
16cb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16cc0 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
16cd0 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
16ce0 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
16cf0 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
16d00 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  ed = 1;.      go
16d10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
16d20 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
16d30 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
16d40 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
16d50 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
16d60 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
16d70 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
16d80 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
16d90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16da0 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
16db0 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e 20  .busy is 0 then 
16dc0 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65 78  create the index
16dd0 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73 0a   on disk.  This.
16de0 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72    ** involves wr
16df0 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
16e00 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  into the master 
16e10 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e  table and fillin
16e20 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e  g in the.  ** in
16e30 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75 72  dex with the cur
16e40 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74 65  rent table conte
16e50 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nts..  **.  ** T
16e60 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
16e70 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20 75   is 0 when the u
16e80 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72 73  ser first enters
16e90 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20   a CREATE INDEX 
16ea0 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20  .  ** command.  
16eb0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
16ec0 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62 61   1 when a databa
16ed0 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e 64  se is opened and
16ee0 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49 4e   .  ** CREATE IN
16ef0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20 61  DEX statements a
16f00 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20 74  re read out of t
16f10 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  he master table.
16f20 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61    In.  ** the la
16f30 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69 6e  tter case the in
16f40 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
16f50 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63  ts on disk, whic
16f60 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77 65  h is why.  ** we
16f70 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
16f80 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a  ecreate it..  **
16f90 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
16fa0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
16fb0 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
16fc0 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d 61  rated as a prima
16fd0 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55  ry key.  ** or U
16fe0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
16ff0 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42   of a CREATE TAB
17000 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53  LE statement.  S
17010 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20  ince the table. 
17020 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
17030 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
17040 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
17050 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
17060 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a  tialization.  **
17070 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
17080 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  pped..  */.  els
17090 65 7b 20 2f 2a 20 69 66 28 20 64 62 2d 3e 69 6e  e{ /* if( db->in
170a0 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 2a 2f 0a  it.busy==0 ) */.
170b0 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
170c0 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
170d0 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
170e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
170f0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
17100 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
17110 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
17120 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17130 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72  dex;...    /* Cr
17140 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
17150 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
17160 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
17170 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
17180 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
17190 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
171a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
171b0 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
171c0 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20  iDb, iMem);..   
171d0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
171e0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
171f0 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
17200 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
17210 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
17220 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
17230 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
17240 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
17250 20 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20   pEnd!=0 );.    
17260 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
17270 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
17280 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
17290 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
172a0 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
172b0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
172c0 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
172d0 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
172e0 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
172f0 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
17300 0a 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70  .        (int)(p
17310 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  End->z - pName->
17320 7a 29 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20  z) + 1,.        
17330 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
17340 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
17350 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
17360 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
17370 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
17380 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
17390 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
173a0 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
173b0 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
173c0 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
173d0 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
173e0 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
173f0 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
17400 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
17410 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
17420 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
17430 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
17440 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
17450 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25  'index',%Q,%Q,#%
17460 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  d,%Q);",.       
17470 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
17480 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
17490 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
174a0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
174b0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
174c0 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d  me,.        iMem
174d0 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a  ,.        zStmt.
174e0 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
174f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
17500 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
17510 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
17520 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
17530 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
17540 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
17550 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
17560 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
17570 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
17580 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17590 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
175a0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
175b0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
175c0 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
175d0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
175e0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
175f0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
17600 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
17610 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
17620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
17630 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
17640 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
17650 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d  index'", pIndex-
17660 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
17670 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17680 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
17690 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
176a0 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
176b0 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
176c0 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
176d0 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
176e0 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
176f0 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
17700 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
17710 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
17720 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
17730 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
17740 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
17750 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
17760 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
17770 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
17780 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
17790 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
177a0 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
177b0 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
177c0 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
177d0 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
177e0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
177f0 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
17800 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
17810 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
17820 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
17830 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
17840 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
17850 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
17860 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
17870 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
17880 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
17890 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
178a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
178b0 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
178c0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
178d0 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
178e0 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
178f0 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
17900 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
17910 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
17920 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
17930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
17940 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
17950 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
17960 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
17970 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
17980 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e  }.    pRet = pIn
17990 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
179a0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
179b0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
179c0 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
179d0 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
179e0 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
179f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17a00 62 2c 20 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  b, pIndex->zColA
17a10 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ff);.    sqlite3
17a20 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64 65  DbFree(db, pInde
17a30 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
17a40 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
17a50 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
17a60 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
17a70 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
17a80 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
17a90 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
17aa0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
17ab0 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49  /*.** Fill the I
17ac0 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20  ndex.aiRowEst[] 
17ad0 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61 75  array with defau
17ae0 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  lt information -
17af0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
17b00 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
17b10 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20  we have not run 
17b20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d  the ANALYZE comm
17b30 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77  and..**.** aiRow
17b40 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73  Est[0] is suppos
17b50 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
17b60 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
17b70 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  nts in the index
17b80 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f  ..** Since we do
17b90 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73   not know, guess
17ba0 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52   1 million.  aiR
17bb0 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65  owEst[1] is an e
17bc0 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a  stimate of the.*
17bd0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
17be0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
17bf0 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
17c00 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66  ticular value of
17c10 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f   the.** first co
17c20 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
17c30 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20  x.  aiRowEst[2] 
17c40 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  is an estimate o
17c50 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  f the number.** 
17c60 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74  of rows that mat
17c70 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
17c80 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f  r combiniation o
17c90 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63 6f  f the first 2 co
17ca0 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
17cb0 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66  index.  And so f
17cc0 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61  orth.  It must a
17cd0 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61 73  lways be the cas
17ce0 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20  e that.*.**     
17cf0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
17d00 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d  ]<=aiRowEst[N-1]
17d10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
17d20 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a  RowEst[N]>=1.**.
17d30 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68  ** Apart from th
17d40 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74  at, we have litt
17d50 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69  le to go on besi
17d60 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73  des intuition as
17d70 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77   to.** how aiRow
17d80 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  Est[] should be 
17d90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68  initialized.  Th
17da0 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61  e numbers genera
17db0 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20  ted here.** are 
17dc0 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c  based on typical
17dd0 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e   values found in
17de0 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e   actual indices.
17df0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17e00 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e  DefaultRowEst(In
17e10 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
17e20 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64 78  signed *a = pIdx
17e30 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e  ->aiRowEst;.  in
17e40 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
17e50 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d  n;.  assert( a!=
17e60 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 49  0 );.  a[0] = pI
17e70 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
17e80 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c  Est;.  if( a[0]<
17e90 31 30 20 29 20 61 5b 30 5d 20 3d 20 31 30 3b 0a  10 ) a[0] = 10;.
17ea0 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28    n = 10;.  for(
17eb0 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 43  i=1; i<=pIdx->nC
17ec0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
17ed0 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20 20 69   a[i] = n;.    i
17ee0 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20 20  f( n>5 ) n--;.  
17ef0 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
17f00 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
17f10 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43  {.    a[pIdx->nC
17f20 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a  olumn] = 1;.  }.
17f30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
17f40 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
17f50 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
17f60 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
17f70 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
17f80 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
17f90 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
17fa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
17fb0 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
17fc0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
17fd0 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
17fe0 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
17ff0 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
18000 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
18010 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
18020 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65  int iDb;..  asse
18030 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
18040 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65  ==0 );   /* Neve
18050 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
18060 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
18070 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
18080 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
18090 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
180a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
180b0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
180c0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
180d0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
180e0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
180f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
18100 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
18110 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
18120 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
18130 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
18140 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
18150 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
18160 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
18170 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
18180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
18190 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
181a0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
181b0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
181c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
181d0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
181e0 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
181f0 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
18200 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
18210 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
18220 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
18230 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
18240 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
18250 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  if( pIndex->auto
18260 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
18270 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18280 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
18290 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
182a0 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
182b0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
182c0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
182d0 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
182e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
182f0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
18300 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
18310 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
18320 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
18330 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18340 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
18350 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
18360 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
18370 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
18380 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
18390 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
183a0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
183b0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
183c0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
183d0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
183e0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
183f0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
18400 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
18410 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
18420 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
18430 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
18440 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
18450 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
18460 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
18470 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
18480 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
18490 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
184a0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
184b0 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
184c0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
184d0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
184e0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
184f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
18500 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
18510 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
18520 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
18530 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
18540 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
18550 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
18560 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
18570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
18580 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
18590 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
185a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
185b0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
185c0 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
185d0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
185e0 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
185f0 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
18600 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
18610 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
18620 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65  ABLE(iDb), pInde
18630 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
18640 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
18650 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
18660 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70  e, iDb, "idx", p
18670 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Index->zName);. 
18680 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
18690 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
186a0 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
186b0 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
186c0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
186d0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
186e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
186f0 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
18700 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
18710 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
18720 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
18730 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
18740 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
18750 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
18760 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
18770 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
18780 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f 62  bjects.  Each ob
18790 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61  ject in the.** a
187a0 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20  rray is szEntry 
187b0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20  bytes in size.  
187c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  This routine all
187d0 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  ocates a new.** 
187e0 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65 6e  object on the en
187f0 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e 0a  d of the array..
18800 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69  **.** *pnEntry i
18810 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18820 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79 20  entries already 
18830 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f  in use.  *pnAllo
18840 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65 76  c is.** the prev
18850 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64  iously allocated
18860 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
18870 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69 73  ay.  initSize is
18880 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74 65   the.** suggeste
18890 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79 20  d initial array 
188a0 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  size allocation.
188b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78  .**.** The index
188c0 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74 72   of the new entr
188d0 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  y is returned in
188e0 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pIdx..**.** Th
188f0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
18900 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
18910 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62 6a  the array of obj
18920 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  ects.  This.** m
18930 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65  ight be the same
18940 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20 70   as the pArray p
18950 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20 6d  arameter or it m
18960 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65 72  ight be a differ
18970 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  ent.** pointer i
18980 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73 20  f the array was 
18990 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64  resized..*/.void
189a0 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
189b0 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
189c0 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
189d0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
189e0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
189f0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
18a00 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
18a10 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
18a20 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
18a30 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
18a40 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
18a50 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
18a60 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
18a70 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69  ray */.  int ini
18a80 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75  tSize,     /* Su
18a90 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20  ggested initial 
18aa0 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
18ab0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
18ac0 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
18ad0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
18ae0 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
18af0 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
18b00 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43  nAlloc,     /* C
18b10 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
18b20 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  he allocation, i
18b30 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  n elements */.  
18b40 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
18b50 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
18b60 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
18b70 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
18b80 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a  char *z;.  if( *
18b90 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c  pnEntry >= *pnAl
18ba0 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  loc ){.    void 
18bb0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
18bc0 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53  ewSize;.    newS
18bd0 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29  ize = (*pnAlloc)
18be0 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20  *2 + initSize;. 
18bf0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
18c00 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
18c10 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73  Array, newSize*s
18c20 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28  zEntry);.    if(
18c30 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
18c40 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20    *pIdx = -1;.  
18c50 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61      return pArra
18c60 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  y;.    }.    *pn
18c70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
18c80 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
18c90 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20  pNew)/szEntry;. 
18ca0 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
18cb0 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
18cc0 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
18cd0 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20  set(&z[*pnEntry 
18ce0 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73  * szEntry], 0, s
18cf0 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78  zEntry);.  *pIdx
18d00 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b   = *pnEntry;.  +
18d10 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
18d20 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
18d30 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
18d40 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
18d50 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
18d60 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
18d70 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
18d80 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
18d90 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
18da0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
18db0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
18dc0 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
18dd0 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c  IdListAppend(sql
18de0 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
18df0 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
18e00 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69  pToken){.  int i
18e10 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
18e20 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
18e30 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
18e40 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49  ero(db, sizeof(I
18e50 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  dList) );.    if
18e60 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
18e70 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
18e80 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
18e90 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
18ea0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
18eb0 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
18ec0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
18ed0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
18ee0 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
18ef0 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  5,.      &pList-
18f00 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c 69  >nId,.      &pLi
18f10 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20  st->nAlloc,.    
18f20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
18f30 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
18f40 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
18f50 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
18f60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
18f70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
18f80 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
18f90 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
18fa0 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
18fb0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
18fc0 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
18fd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
18fe0 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
18ff0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
19000 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
19010 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
19020 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
19030 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
19040 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
19050 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19060 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
19070 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
19080 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
19090 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
190a0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
190b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
190c0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
190d0 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
190e0 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
190f0 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
19100 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
19110 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
19120 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
19130 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
19140 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
19150 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
19160 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
19170 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
19180 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
19190 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
191a0 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
191b0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
191c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
191d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
191e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
191f0 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
19200 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
19210 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
19220 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
19230 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
19240 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
19250 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
19260 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
19270 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
19280 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
19290 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
192a0 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
192b0 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
192c0 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
192d0 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
192e0 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
192f0 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
19300 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
19310 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
19320 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
19330 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
19340 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
19350 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
19360 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
19370 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
19380 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
19390 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
193a0 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
193b0 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
193c0 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
193d0 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
193e0 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
193f0 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
19400 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
19410 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
19420 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
19430 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
19440 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
19450 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
19460 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
19470 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
19480 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
19490 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
194a0 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
194b0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
194c0 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
194d0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
194e0 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
194f0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
19500 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
19510 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
19520 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
19530 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
19540 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
19550 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
19560 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
19570 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
19580 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
19590 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
195a0 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
195b0 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
195c0 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
195d0 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
195e0 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
195f0 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
19600 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
19610 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
19620 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
19630 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
19640 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
19650 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
19660 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19670 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
19680 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
19690 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
196a0 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
196b0 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
196c0 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
196d0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
196e0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
196f0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
19700 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
19710 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
19720 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
19730 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
19740 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
19750 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
19760 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
19770 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
19780 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
19790 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
197a0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
197b0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
197c0 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
197d0 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
197e0 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
197f0 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
19800 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
19810 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
19820 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
19830 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
19840 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47  nAlloc = (u16)nG
19850 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  ot;.  }..  /* Mo
19860 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
19870 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
19880 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
19890 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
198a0 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
198b0 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
198c0 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
198d0 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
198e0 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
198f0 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
19900 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
19910 20 28 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20   (i16)nExtra;.. 
19920 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
19930 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
19940 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
19950 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
19960 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
19970 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
19980 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
19990 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
199a0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
199b0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
199c0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
199d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
199e0 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
199f0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
19a00 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
19a10 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
19a20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
19a30 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
19a40 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
19a50 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
19a60 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
19a70 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
19a80 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
19a90 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
19aa0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
19ab0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
19ac0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
19ad0 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
19ae0 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  or.  The returne
19af0 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67  d.** SrcList mig
19b00 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
19b10 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  s the SrcList th
19b20 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20  at was input or 
19b30 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  it might be.** a
19b40 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e   new one.  If an
19b50 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20   OOM error does 
19b60 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
19b70 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20   prior value of 
19b80 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73  pList.** that is
19b90 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
19ba0 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61  outine is automa
19bb0 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  tically freed..*
19bc0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
19bd0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
19be0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
19bf0 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
19c00 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
19c10 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
19c20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
19c30 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
19c40 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
19c50 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
19c60 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
19c70 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
19c80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19c90 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
19ca0 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
19cb0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
19cc0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
19cd0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
19ce0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
19cf0 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
19d00 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
19d10 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
19d20 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
19d30 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
19d40 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
19d50 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
19d60 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
19d70 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
19d80 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
19d90 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
19da0 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
19db0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
19dc0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
19dd0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
19de0 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,0);.**.** T
19df0 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
19e00 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
19e10 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
19e20 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
19e30 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
19e40 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
19e50 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
19e60 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29  tAppend(D,A,B,C)
19e70 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
19e80 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
19e90 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
19ea0 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66  tabase name.  If
19eb0 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a   C is defined.**
19ec0 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20   then so is B.  
19ed0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
19ee0 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  we never have a 
19ef0 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a  case where:.**.*
19f00 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
19f10 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
19f20 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42  ,A,0,C);.**.** B
19f30 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70  oth pTable and p
19f40 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73  Database are ass
19f50 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65  umed to be quote
19f60 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71  d.  They are deq
19f70 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  uoted.** before 
19f80 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
19f90 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53  he SrcList..*/.S
19fa0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
19fb0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  rcListAppend(.  
19fc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
19fd0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
19fe0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
19ff0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1a000 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  /.  SrcList *pLi
1a010 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  st,     /* Appen
1a020 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73  d to this SrcLis
1a030 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20  t. NULL creates 
1a040 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f  a new SrcList */
1a050 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1a060 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ,      /* Table 
1a070 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54  to append */.  T
1a080 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20  oken *pDatabase 
1a090 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
1a0a0 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  f the table */.)
1a0b0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1a0c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1a0d0 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62    assert( pDatab
1a0e0 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ase==0 || pTable
1a0f0 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  !=0 );  /* Canno
1a100 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74  t have C without
1a110 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73   B */.  if( pLis
1a120 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1a130 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1a140 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1a150 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
1a160 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1a170 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a180 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
1a190 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  1;.  }.  pList =
1a1a0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1a1b0 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74  nlarge(db, pList
1a1c0 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63  , 1, pList->nSrc
1a1d0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1a1e0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1a1f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1a200 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1a210 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1a220 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1a230 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
1a240 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44  Src-1];.  if( pD
1a250 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
1a260 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
1a270 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
1a280 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
1a290 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  base ){.    Toke
1a2a0 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
1a2b0 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
1a2c0 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
1a2d0 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
1a2e0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
1a2f0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1a300 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1a310 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d  pTable);.  pItem
1a320 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
1a330 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a340 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
1a350 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
1a360 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
1a370 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e  gn VdbeCursor in
1a380 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61  dex numbers to a
1a390 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
1a3a0 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
1a3b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1a3c0 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
1a3d0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1a3e0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1a3f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
1a400 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a410 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
1a420 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1a430 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a440 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
1a450 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
1a460 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
1a470 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1a480 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1a490 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
1a4a0 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
1a4b0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
1a4c0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
1a4d0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
1a4e0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
1a4f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a500 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1a510 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
1a520 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
1a530 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
1a540 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1a550 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
1a560 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
1a570 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
1a580 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
1a590 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1a5a0 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1a5b0 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  b, SrcList *pLis
1a5c0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
1a5d0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1a5e0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
1a5f0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1a600 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
1a610 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1a620 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1a630 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1a640 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a650 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  b, pItem->zDatab
1a660 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
1a670 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1a680 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
1a690 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a6a0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1a6b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1a6c0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49  ee(db, pItem->zI
1a6d0 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
1a6e0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
1a6f0 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
1a700 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1a710 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1a720 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
1a730 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1a740 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f  te(db, pItem->pO
1a750 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
1a760 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1a770 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  pItem->pUsing);.
1a780 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1a790 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
1a7a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1a7b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1a7c0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
1a7d0 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
1a7e0 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
1a7f0 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
1a800 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
1a810 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1a820 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
1a830 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
1a840 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1a850 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
1a860 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
1a870 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1a880 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
1a890 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
1a8a0 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1a8b0 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
1a8c0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1a8d0 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
1a8e0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1a8f0 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
1a900 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1a910 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
1a920 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
1a930 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
1a940 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
1a950 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
1a960 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20  s a alias, then 
1a970 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
1a980 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
1a990 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
1a9a0 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
1a9b0 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
1a9c0 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
1a9d0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
1a9e0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
1a9f0 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
1aa00 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
1aa10 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
1aa20 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
1aa30 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
1aa40 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
1aa50 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
1aa60 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1aa70 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1aa80 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
1aa90 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
1aaa0 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
1aab0 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
1aac0 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
1aad0 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
1aae0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1aaf0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
1ab00 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ab10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1ab20 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1ab30 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
1ab40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ab50 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
1ab60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
1ab70 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
1ab80 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1ab90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1aba0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
1abb0 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
1abc0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
1abd0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
1abe0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1abf0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1ac00 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
1ac10 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
1ac20 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
1ac30 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
1ac40 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
1ac50 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1ac60 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
1ac70 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
1ac80 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
1ac90 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
1aca0 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
1acb0 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
1acc0 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
1acd0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
1ace0 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
1acf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ad00 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1ad10 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
1ad20 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1ad30 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
1ad40 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1ad50 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
1ad60 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
1ad70 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
1ad80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ad90 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
1ada0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
1adb0 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
1adc0 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
1add0 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
1ade0 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
1adf0 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
1ae00 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
1ae10 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
1ae20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
1ae30 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
1ae40 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d  | NEVER(p->nSrc=
1ae50 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =0) ){.    goto 
1ae60 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1ae70 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  r;.  }.  pItem =
1ae80 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1ae90 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c  ];.  assert( pAl
1aea0 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ias!=0 );.  if( 
1aeb0 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20  pAlias->n ){.   
1aec0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pItem->zAlias =
1aed0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1aee0 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73  Token(db, pAlias
1aef0 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  );.  }.  pItem->
1af00 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75  pSelect = pSubqu
1af10 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f  ery;.  pItem->pO
1af20 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d  n = pOn;.  pItem
1af30 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e  ->pUsing = pUsin
1af40 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a  g;.  return p;..
1af50 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1af60 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d  or:.  assert( p=
1af70 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
1af80 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f  xprDelete(db, pO
1af90 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  n);.  sqlite3IdL
1afa0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55  istDelete(db, pU
1afb0 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  sing);.  sqlite3
1afc0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1afd0 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72   pSubquery);.  r
1afe0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1aff0 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44  * Add an INDEXED
1b000 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58   BY or NOT INDEX
1b010 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ED clause to the
1b020 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
1b030 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74  dded .** element
1b040 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   of the source-l
1b050 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
1b060 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1b070 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1b080 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64  e3SrcListIndexed
1b090 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
1b0a0 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f  , SrcList *p, To
1b0b0 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29  ken *pIndexedBy)
1b0c0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64  {.  assert( pInd
1b0d0 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69  exedBy!=0 );.  i
1b0e0 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
1b0f0 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20  ->nSrc>0) ){.   
1b100 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1b110 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1b120 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1b130 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1b140 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  m->notIndexed==0
1b150 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65   && pItem->zInde
1b160 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  x==0 );.    if( 
1b170 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31  pIndexedBy->n==1
1b180 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d   && !pIndexedBy-
1b190 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  >z ){.      /* A
1b1a0 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
1b1b0 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69  lause was suppli
1b1c0 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20  ed. See parse.y 
1b1d0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
1b1e0 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74  uct "indexed_opt
1b1f0 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  " for details. *
1b200 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e  /.      pItem->n
1b210 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20  otIndexed = 1;. 
1b220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b230 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20  pItem->zIndex = 
1b240 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1b250 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1b260 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
1b270 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1b280 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
1b290 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
1b2a0 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
1b2b0 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1b2c0 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
1b2d0 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
1b2e0 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
1b2f0 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
1b300 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
1b310 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
1b320 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
1b330 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
1b340 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1b350 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
1b360 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
1b370 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
1b380 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
1b390 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
1b3a0 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
1b3b0 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
1b3c0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1b3d0 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
1b3e0 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
1b3f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
1b400 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
1b410 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
1b420 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
1b430 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
1b440 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
1b450 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
1b460 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
1b470 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
1b480 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
1b490 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
1b4a0 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
1b4b0 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
1b4c0 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
1b4d0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1b4e0 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
1b4f0 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
1b500 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
1b510 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1b520 61 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20  a || p->nSrc==0 
1b530 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e  );.    for(i=p->
1b540 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  nSrc-1; i>0; i--
1b550 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  ){.      p->a[i]
1b560 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61  .jointype = p->a
1b570 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a  [i-1].jointype;.
1b580 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30      }.    p->a[0
1b590 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  ].jointype = 0;.
1b5a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67    }.}../*.** Beg
1b5b0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1b5c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b5d0 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
1b5e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b5f0 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
1b600 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
1b610 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
1b620 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1b630 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
1b640 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
1b650 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20  t( db!=0 );./*  
1b660 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  if( db->aDb[0].p
1b670 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  Bt==0 ) return; 
1b680 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1b690 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1b6a0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1b6b0 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
1b6c0 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1b6d0 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1b6e0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1b6f0 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
1b700 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
1b710 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
1b720 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
1b730 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1b740 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1b750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b760 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
1b770 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
1b780 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73  IVE)+1);.      s
1b790 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
1b7a0 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d  ree(v, i);.    }
1b7b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1b7c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1b7d0 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  utoCommit, 0, 0)
1b7e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1b7f0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
1b800 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1b810 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
1b820 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1b830 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1b840 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
1b850 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
1b860 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
1b870 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1b880 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28  db!=0 );./*  if(
1b890 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
1b8a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a  =0 ) return; */.
1b8b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1b8c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1b8d0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
1b8e0 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  N, "COMMIT", 0, 
1b8f0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1b900 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1b910 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1b920 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1b930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b940 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1b950 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20  ommit, 1, 0);.  
1b960 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  }.}../*.** Rollb
1b970 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1b980 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
1b990 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63  3RollbackTransac
1b9a0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1b9b0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
1b9c0 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  db;.  Vdbe *v;..
1b9d0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1b9e0 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
1b9f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
1ba00 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20  rt( db!=0 );./* 
1ba10 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e   if( db->aDb[0].
1ba20 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pBt==0 ) return;
1ba30 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1ba40 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1ba50 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1ba60 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b  CTION, "ROLLBACK
1ba70 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
1ba80 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
1ba90 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1baa0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1bab0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1bac0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1bad0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
1bae0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
1baf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1bb00 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1bb10 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
1bb20 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
1bb30 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
1bb40 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1bb50 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
1bb60 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
1bb70 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
1bb80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1bb90 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
1bba0 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
1bbb0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1bbc0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1bbd0 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
1bbe0 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
1bbf0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1bc00 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1bc10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1bc20 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
1bc30 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
1bc40 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
1bc50 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49  t az[] = { "BEGI
1bc60 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
1bc70 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
1bc80 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
1bc90 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
1bca0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
1bcb0 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
1bcc0 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
1bcd0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
1bce0 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
1bcf0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1bd00 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
1bd10 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
1bd20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1bd30 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1bd40 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
1bd50 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1bd60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1bd70 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
1bd80 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
1bd90 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
1bda0 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
1bdb0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
1bdc0 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
1bdd0 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
1bde0 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
1bdf0 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
1be00 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
1be10 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
1be20 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
1be30 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
1be40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
1be50 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
1be60 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1be70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1be80 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1be90 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
1bea0 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
1beb0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
1bec0 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
1bed0 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63  *pBt;.    static
1bee0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
1bef0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
1bf00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1bf10 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
1bf20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1bf30 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
1bf40 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1bf50 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
1bf60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1bf70 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
1bf80 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1bf90 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
1bfa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1bfb0 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
1bfc0 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c   0, db, &pBt, 0,
1bfd0 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
1bfe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1c000 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c010 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
1c020 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
1c030 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
1c040 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
1c050 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1c060 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
1c070 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
1c080 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1c090 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d  }.    db->aDb[1]
1c0a0 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  .pBt = pBt;.    
1c0b0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1c0c0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
1c0d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
1c0e0 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
1c0f0 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
1c100 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
1c110 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20  e, -1, 0) ){.   
1c120 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
1c130 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
1c140 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1c150 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1c160 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c170 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1c180 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
1c190 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
1c1a0 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
1c1b0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
1c1c0 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
1c1d0 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
1c1e0 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
1c1f0 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
1c200 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
1c210 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
1c220 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1c230 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
1c240 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
1c250 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
1c260 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1c270 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
1c280 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
1c290 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
1c2a0 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
1c2b0 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
1c2c0 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
1c2d0 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
1c2e0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
1c2f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1c300 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
1c310 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
1c320 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
1c330 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
1c340 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
1c350 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
1c360 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
1c370 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
1c380 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
1c390 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
1c3a0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1c3b0 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
1c3c0 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
1c3d0 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
1c3e0 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
1c3f0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
1c400 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
1c410 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
1c420 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
1c430 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
1c440 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
1c450 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
1c460 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
1c470 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
1c480 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
1c490 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
1c4a0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
1c4b0 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
1c4c0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
1c4d0 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
1c4e0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
1c4f0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
1c500 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
1c510 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
1c520 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
1c530 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
1c540 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
1c550 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
1c560 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
1c570 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
1c580 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
1c590 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
1c5a0 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
1c5b0 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
1c5c0 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
1c5d0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
1c5e0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
1c5f0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1c600 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
1c610 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1c620 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1c630 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  Parse);..  if( p
1c640 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1c650 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 56  Goto==0 ){.    V
1c660 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
1c670 47 65 74 56 64 62 65 28 70 54 6f 70 6c 65 76 65  GetVdbe(pTopleve
1c680 6c 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  l);.    if( v==0
1c690 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
1c6a0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
1c6b0 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20   if there was a 
1c6c0 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20  prior error */. 
1c6d0 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f     pToplevel->co
1c6e0 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
1c6f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1c700 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31  OP_Goto, 0, 0)+1
1c710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e  ;.  }.  if( iDb>
1c720 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1c730 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65  3 *db = pTopleve
1c740 6c 2d 3e 64 62 3b 0a 20 20 20 20 79 44 62 4d 61  l->db;.    yDbMa
1c750 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 61 73  sk mask;..    as
1c760 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
1c770 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
1c780 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1c790 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
1c7a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
1c7b0 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
1c7c0 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 61  ACHED+2 );.    a
1c7d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1c7e0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1c7f0 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
1c800 20 6d 61 73 6b 20 3d 20 28 28 79 44 62 4d 61 73   mask = ((yDbMas
1c810 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 20 20 69  k)1)<<iDb;.    i
1c820 66 28 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  f( (pToplevel->c
1c830 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
1c840 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54  )==0 ){.      pT
1c850 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
1c860 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1c870 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f     pToplevel->co
1c880 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
1c890 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1c8a0 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
1c8b0 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20  okie;.      if( 
1c8c0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1c8d0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
1c8e0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
1c8f0 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65  pDatabase(pTople
1c900 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  vel);.      }.  
1c910 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1c920 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62   If argument zDb
1c930 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63   is NULL, then c
1c940 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56  all sqlite3CodeV
1c950 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f  erifySchema() fo
1c960 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63  r each .** attac
1c970 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74  hed database. Ot
1c980 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20  herwise, invoke 
1c990 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  it for the datab
1c9a0 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e  ase named zDb on
1c9b0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
1c9c0 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
1c9d0 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  edSchema(Parse *
1c9e0 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1c9f0 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69  ar *zDb){.  sqli
1ca00 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1ca10 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
1ca20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1ca30 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
1ca40 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
1ca50 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
1ca60 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20  b->pBt && (!zDb 
1ca70 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  || 0==sqlite3Str
1ca80 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a  ICmp(zDb, pDb->z
1ca90 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20  Name)) ){.      
1caa0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1cab0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
1cac0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
1cad0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cae0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
1caf0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
1cb00 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
1cb10 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1cb20 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
1cb30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1cb40 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
1cb50 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
1cb60 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
1cb70 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
1cb80 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1cb90 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
1cba0 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1cbb0 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
1cbc0 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
1cbd0 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
1cbe0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
1cbf0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
1cc00 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
1cc10 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
1cc20 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
1cc30 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
1cc40 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
1cc50 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
1cc60 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
1cc70 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
1cc80 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
1cc90 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1cca0 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
1ccb0 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
1ccc0 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
1ccd0 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
1cce0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
1ccf0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
1cd00 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
1cd10 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
1cd20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
1cd30 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
1cd40 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
1cd50 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
1cd60 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
1cd70 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
1cd80 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1cd90 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
1cda0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
1cdb0 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
1cdc0 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
1cdd0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1cde0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1cdf0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
1ce00 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1ce10 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
1ce20 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77  ;.  pToplevel->w
1ce30 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44  riteMask |= ((yD
1ce40 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20  bMask)1)<<iDb;. 
1ce50 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
1ce60 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
1ce70 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
1ce80 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
1ce90 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
1cea0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1ceb0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
1cec0 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
1ced0 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
1cee0 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
1cef0 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
1cf00 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
1cf10 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
1cf20 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
1cf30 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
1cf40 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
1cf50 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
1cf60 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
1cf70 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
1cf80 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
1cf90 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
1cfa0 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
1cfb0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1cfc0 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
1cfd0 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
1cfe0 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
1cff0 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
1d000 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
1d010 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1d020 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1d030 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
1d040 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
1d050 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
1d060 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1d070 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
1d080 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
1d090 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
1d0a0 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
1d0b0 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
1d0c0 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
1d0d0 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
1d0e0 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
1d0f0 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
1d100 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
1d110 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
1d120 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
1d130 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
1d140 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
1d150 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
1d160 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1d170 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
1d180 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
1d190 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
1d1a0 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
1d1b0 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
1d1c0 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
1d1d0 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
1d1e0 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
1d1f0 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
1d200 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
1d210 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
1d220 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
1d230 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
1d240 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
1d250 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
1d260 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
1d270 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
1d280 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
1d290 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
1d2a0 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
1d2b0 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
1d2c0 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
1d2d0 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
1d2e0 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
1d2f0 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
1d300 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
1d310 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
1d320 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
1d330 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
1d340 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1d350 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
1d360 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
1d370 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
1d380 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
1d390 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
1d3a0 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
1d3b0 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
1d3c0 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
1d3d0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
1d3e0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1d3f0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1d400 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1d410 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
1d420 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
1d430 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
1d440 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
1d450 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
1d460 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
1d470 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
1d480 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
1d490 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
1d4a0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
1d4b0 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
1d4c0 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
1d4d0 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
1d4e0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1d4f0 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
1d500 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
1d510 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  int(Parse *pPars
1d520 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  e, int onError, 
1d530 63 68 61 72 20 2a 70 34 2c 20 69 6e 74 20 70 34  char *p4, int p4
1d540 74 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  type){.  Vdbe *v
1d550 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1d560 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1d570 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f   onError==OE_Abo
1d580 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
1d590 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
1d5a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1d5b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1d5c0 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f  _Halt, SQLITE_CO
1d5d0 4e 53 54 52 41 49 4e 54 2c 20 6f 6e 45 72 72 6f  NSTRAINT, onErro
1d5e0 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65  r, 0, p4, p4type
1d5f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
1d600 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
1d610 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
1d620 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1d630 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
1d640 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
1d650 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
1d660 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
1d670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d680 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1d690 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
1d6a0 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
1d6b0 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
1d6c0 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
1d6d0 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
1d6e0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
1d6f0 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
1d700 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  mn; i++){.    co
1d710 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
1d720 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  ndex->azColl[i];
1d730 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
1d740 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0 );.    if( 0==
1d750 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1d760 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
1d770 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1d780 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1d790 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1d7a0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
1d7b0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
1d7c0 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
1d7d0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1d7e0 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
1d7f0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
1d800 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1d810 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
1d820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d830 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
1d840 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
1d850 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1d860 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68   Table *pTab, ch
1d870 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
1d880 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1d890 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1d8a0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
1d8b0 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
1d8c0 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65   */..  for(pInde
1d8d0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
1d8e0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
1d8f0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
1d900 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20     if( zColl==0 
1d910 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
1d920 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29  h(zColl, pIndex)
1d930 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
1d940 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1d950 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
1d960 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
1d970 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
1d980 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1d990 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
1d9a0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
1d9b0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
1d9c0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
1d9d0 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  -1);.    }.  }.}
1d9e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1d9f0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
1da00 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
1da10 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
1da20 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
1da30 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
1da40 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1da50 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
1da60 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1da70 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
1da80 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
1da90 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1daa0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1dab0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
1dac0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
1dad0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
1dae0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
1daf0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db10 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
1db20 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
1db30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db40 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1db50 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
1db60 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
1db70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1db80 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1db90 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1dba0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dbc0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1dbd0 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
1dbe0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1dbf0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1dc00 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1dc10 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1dc20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1dc30 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
1dc40 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f  utexes(db) );  /
1dc50 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68  * Needed for sch
1dc60 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20  ema access */.  
1dc70 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
1dc80 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
1dc90 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
1dca0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1dcb0 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
1dcc0 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
1dcd0 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
1dce0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
1dcf0 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
1dd00 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
1dd10 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
1dd20 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
1dd30 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
1dd40 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1dd50 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
1dd60 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1dd70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1dd80 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
1dd90 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
1dda0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
1ddd0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1dde0 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
1ddf0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
1de00 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1de10 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
1de20 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
1de30 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
1de40 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1de50 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
1de60 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
1de70 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
1de80 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
1de90 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
1dea0 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
1deb0 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
1dec0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
1ded0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
1dee0 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
1def0 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
1df00 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
1df10 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
1df20 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
1df30 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
1df40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1df50 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
1df60 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1df70 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1df80 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
1df90 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1dfa0 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
1dfb0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
1dfc0 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
1dfd0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1dfe0 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
1dff0 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
1e000 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
1e010 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
1e040 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
1e050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1e060 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1e070 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1e080 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
1e090 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
1e0a0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
1e0b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1e0c0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
1e0d0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1e0e0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1e0f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1e100 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1e130 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1e140 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1e150 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1e160 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1e170 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1e180 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
1e190 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1e1a0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1e1b0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
1e1c0 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
1e1d0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
1e1e0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
1e1f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1e200 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
1e210 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
1e220 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
1e230 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
1e240 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
1e250 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1e260 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1e270 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1e280 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
1e290 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  1==0 ){.    rein
1e2a0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1e2b0 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
1e2c0 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
1e2d0 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30   NEVER(pName2==0
1e2e0 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  ) || pName2->z==
1e2f0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
1e300 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
1e310 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
1e320 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
1e330 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1e340 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1e350 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
1e360 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
1e370 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1e380 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
1e390 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
1e3a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
1e3b0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
1e3c0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1e3d0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
1e3e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1e3f0 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
1e400 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1e410 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1e420 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
1e430 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
1e440 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
1e450 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
1e460 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
1e470 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
1e480 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
1e490 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1e4a0 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
1e4b0 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
1e4c0 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
1e4d0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1e4e0 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
1e4f0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1e500 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
1e510 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
1e520 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1e530 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
1e540 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e550 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   z);.    return;
1e560 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1e570 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1e580 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
1e590 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e5a0 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , z);.  if( pInd
1e5b0 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
1e5c0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1e5d0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
1e5e0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1e5f0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1e600 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
1e610 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1e620 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
1e630 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1e640 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
1e650 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
1e660 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
1e670 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1e680 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79  turn a dynamicly
1e690 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e   allocated KeyIn
1e6a0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
1e6b0 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a  t can be used.**
1e6c0 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61   with OP_OpenRea
1e6d0 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74  d or OP_OpenWrit
1e6e0 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  e to access data
1e6f0 62 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e  base index pIdx.
1e700 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1e710 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20  sful, a pointer 
1e720 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63  to the new struc
1e730 74 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64  ture is returned
1e740 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
1e750 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
1e760 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
1e770 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 44  calling sqlite3D
1e780 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 74  bFree(db, ) on t
1e790 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20  he returned .** 
1e7a0 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65  pointer. If an e
1e7b0 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74  rror occurs (out
1e7c0 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69   of memory or mi
1e7d0 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  ssing collation 
1e7e0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e  .** sequence), N
1e7f0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
1e800 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  and the state of
1e810 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20   pParse updated 
1e820 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68  to reflect.** th
1e830 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49  e error..*/.KeyI
1e840 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65  nfo *sqlite3Inde
1e850 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a  xKeyinfo(Parse *
1e860 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
1e870 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
1e880 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
1e890 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
1e8a0 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66   nBytes = sizeof
1e8b0 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f  (KeyInfo) + (nCo
1e8c0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c  l-1)*sizeof(Coll
1e8d0 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20  Seq*) + nCol;.  
1e8e0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1e8f0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49  arse->db;.  KeyI
1e900 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79  nfo *pKey = (Key
1e910 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33 44 62  Info *)sqlite3Db
1e920 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
1e930 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70  Bytes);..  if( p
1e940 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d  Key ){.    pKey-
1e950 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  >db = pParse->db
1e960 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72  ;.    pKey->aSor
1e970 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26  tOrder = (u8 *)&
1e980 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f  (pKey->aColl[nCo
1e990 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l]);.    assert(
1e9a0 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64   &pKey->aSortOrd
1e9b0 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38  er[nCol]==&(((u8
1e9c0 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d   *)pKey)[nBytes]
1e9d0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
1e9e0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
1e9f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
1ea00 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
1ea10 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
1ea20 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  t( zColl );.    
1ea30 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
1ea40 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
1ea50 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1ea60 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
1ea70 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
1ea80 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
1ea90 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
1eaa0 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
1eab0 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d  = (u16)nCol;.  }
1eac0 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1ead0 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
1eae0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
1eaf0 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20  ey);.    pKey = 
1eb00 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1eb10 70 4b 65 79 3b 0a 7d 0a                          pKey;.}.