/ Hex Artifact Content
Login

Artifact b2771cc57484ee4225a9eb6e57e6933be3f96e3b:


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 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
10b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10c0: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
10d0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10f0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1100: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1110: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1120: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1130: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1140: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1150: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1160: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1170: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1180: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1190: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
11a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11b0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11c0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11d0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11e0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11f0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1200: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1210: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1220: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79  oto>0 ){.      y
1230: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20  DbMask mask;.   
1240: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
1250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1260: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1270: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1280: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
1290: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
12a0: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
12b0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
12c0: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12d0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1310: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1330: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1340: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1350: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1360: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
1370: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13a0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13b0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
13c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20  VerifyCookie,.  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 69 44 62 2c 20 70            iDb, p
1410: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1420: 75 65 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20  ue[iDb],.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1450: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1460: 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ration);.       
1470: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64   }.      }.#ifnd
1480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1490: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14a0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
14b0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
14c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
14d0: 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  tabLock; i++){. 
14e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76           char *v
14f0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1500: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1510: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1520: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1550: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
1560: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1580: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1590: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  k = 0;.      }.#
15a0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
15b0: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
15c0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
15d0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
15e0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
15f0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1600: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1610: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1620: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1630: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1640: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1650: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1660: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1670: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1680: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1690: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
16a0: 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  y AUTOINCREMENT 
16b0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
16c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
16d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
16e0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67  AutoincrementBeg
16f0: 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  in(pParse);..   
1700: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1710: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1720: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1730: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1740: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1760: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
1770: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b  se->cookieGoto);
1780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1790: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
17a0: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
17b0: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
17c0: 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41 59    if( v && ALWAY
17d0: 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  S(pParse->nErr==
17e0: 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  0) && !db->mallo
17f0: 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65  cFailed ){.#ifde
1800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1810: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
1820: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1830: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
1840: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
1850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1860: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
1870: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
1880: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1890: 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f  heLevel==0 );  /
18a0: 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72  * Disables and r
18b0: 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20  e-enables match 
18c0: 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69  */.    /* A mini
18d0: 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f  mum of one curso
18e0: 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66  r is required if
18f0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69   autoincrement i
1900: 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65  s used.    *  Se
1910: 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37  e ticket [a69637
1920: 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20  9c1f08866] */.  
1930: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41    if( pParse->pA
1940: 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 65  inc!=0 && pParse
1950: 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72  ->nTab==0 ) pPar
1960: 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20  se->nTab = 1;.  
1970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
1980: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
1990: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
19a0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
19b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
19c0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
19d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
19e0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
19f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1a00: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1a20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1a30: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1a40: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1a60: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1a70: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1a80: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1a90: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1aa0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1ab0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1ac0: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1ad0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1ae0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1af0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b00: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1b10: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1b20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1b30: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1b40: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1b50: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1b60: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1b70: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1b80: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1b90: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ba0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1bb0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1bc0: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1bd0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1be0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1bf0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1c00: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1c10: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1c20: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1c30: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1c40: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1c50: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1c60: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1c70: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1c80: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1c90: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1ca0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1cb0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1cc0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ce0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1d00: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1d10: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1d20: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1d30: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1d40: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
1d50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d60: 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  b;.# define SAVE
1d70: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1d80: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1d90: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
1da0: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
1db0: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
1dc0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
1dd0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1de0: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1df0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1e00: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1e10: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1e20: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1e30: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1e40: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1e50: 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  tf(db, zFormat, 
1e60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1e70: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
1e90: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75    /* A malloc mu
1ea0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1eb0: 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  /.  }.  pParse->
1ec0: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1ed0: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1ef0: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1f00: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
1f10: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  SAVE_SZ);.  sqli
1f20: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
1f30: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
1f40: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1f50: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1f60: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f70: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
1f80: 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d   memcpy(&pParse-
1f90: 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20  >nVar, saveBuf, 
1fa0: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72  SAVE_SZ);.  pPar
1fb0: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
1fc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1fd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1fe0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1ff0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
2000: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
2010: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
2020: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
2030: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
2040: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
2050: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
2060: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2070: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
2080: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2090: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
20a0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
20b0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
20c0: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
20d0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
20e0: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
20f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
2100: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
2110: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
2120: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
2130: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2140: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
2150: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2160: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
2170: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
2180: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
2190: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
21a0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
21b0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
21c0: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
21d0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
21e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
21f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2210: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
2220: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
2230: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61    int nName;.  a
2240: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
2250: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  );.  nName = sql
2260: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
2270: 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  me);.  /* All mu
2280: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
2290: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
22a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
22b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
22c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61 74  /.  assert( zDat
22d0: 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69  abase!=0 || sqli
22e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
22f0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
2300: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2310: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2320: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2330: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2340: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2350: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2360: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2370: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2380: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2390: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
23a0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
23b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
23c0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
23d0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
23e0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
23f0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2400: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
2410: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  blHash, zName, n
2420: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
2430: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2440: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2450: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2460: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2470: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2480: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2490: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
24a0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
24b0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
24c0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
24d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
24e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
24f0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2500: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
2510: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
2520: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
2530: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2540: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2550: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2560: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2570: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2580: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2590: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
25a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
25b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
25c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
25d0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
25e0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
25f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2600: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2610: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
2620: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2630: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
2640: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
2650: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
2660: 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  View,           
2670: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b   /* True if look
2680: 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72  ing for a VIEW r
2690: 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42  ather than a TAB
26a0: 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LE */.  const ch
26b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
26c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
26d0: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
26e0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
26f0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
2700: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2710: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
2720: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
2730: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
2740: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2750: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2780: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2790: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
27a0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
27b0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
27c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
27d0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
27e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
27f0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
2800: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
2810: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
2820: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2830: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2840: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56  char *zMsg = isV
2850: 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76  iew ? "no such v
2860: 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20  iew" : "no such 
2870: 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20  table";.    if( 
2880: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28a0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
28b0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
28c0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
28d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
28e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28f0: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2900: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
2910: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
2920: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2940: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2950: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
2960: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
2970: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
2980: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
2990: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
29b0: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
29c0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
29d0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
29e0: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
29f0: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
2a00: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
2a10: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
2a20: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
2a30: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
2a40: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
2a50: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
2a60: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
2a70: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
2a80: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
2a90: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
2aa0: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
2ab0: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
2ac0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2ad0: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
2ae0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20  *pParse, .  int 
2af0: 69 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63  isView, .  struc
2b00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b10: 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  p.){.  const cha
2b20: 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74  r *zDb;.  assert
2b30: 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20  ( p->pSchema==0 
2b40: 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d  || p->zDatabase=
2b50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
2b60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e  Schema ){.    in
2b70: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2b80: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2b90: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68  rse->db, p->pSch
2ba0: 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20  ema);.    zDb = 
2bb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
2bc0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  iDb].zName;.  }e
2bd0: 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70  lse{.    zDb = p
2be0: 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d  ->zDatabase;.  }
2bf0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2c00: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
2c10: 72 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e  rse, isView, p->
2c20: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
2c30: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2c40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2c50: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2c60: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2c70: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2c80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2c90: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2ca0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2cb0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2cc0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2ce0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2cf0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2d00: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2d10: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2d20: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2d30: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2d40: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2d60: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2d70: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2d80: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2d90: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2da0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2db0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2dc0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2dd0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2de0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2df0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2e00: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2e10: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2e20: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2e30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2e40: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2e50: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2e60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2e70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2e80: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2e90: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2ea0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2eb0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2ec0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2ed0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2ee0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2ef0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2f00: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2f10: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2f20: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2f30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2f40: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2f50: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2f60: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2f70: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2f80: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2f90: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2fa0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2fb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2fc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2fd0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2fe0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ff0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3000: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3010: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
3020: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
3030: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
3040: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
3050: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
3060: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3090: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
30a0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
30b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
30c0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
30d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
30e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30f0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
3100: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
3110: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3120: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3130: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3140: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3150: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3160: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3170: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
3180: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
3190: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
31a0: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
31b0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
31c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
31d0: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
31e0: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
31f0: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
3200: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
3210: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
3220: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
3230: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
3240: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3250: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
3260: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
3270: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
3280: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
3290: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
32a0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
32b0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
32c0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
32d0: 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70  t len;.  Hash *p
32e0: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
32f0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3300: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3310: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3320: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3330: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3340: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
3350: 53 74 72 6c 65 6e 33 30 28 7a 49 64 78 4e 61 6d  Strlen30(zIdxNam
3360: 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  e);.  pIndex = s
3370: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3380: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
3390: 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20 69 66 28  , len, 0);.  if(
33a0: 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20   ALWAYS(pIndex) 
33b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
33c0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
33d0: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
33e0: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
33f0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
3400: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
3410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
3420: 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a  x *p;.      /* J
3430: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
3440: 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69  ALWAYS();  The i
3450: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20  ndex must be on 
3460: 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20  the list of.    
3470: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f    ** indices. */
3480: 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65  .      p = pInde
3490: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
34a0: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
34b0: 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e  ALWAYS(p) && p->
34c0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b  pNext!=pIndex ){
34d0: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d   p = p->pNext; }
34e0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
34f0: 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  S(p && p->pNext=
3500: 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  =pIndex) ){.    
3510: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
3520: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3530: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3540: 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
3550: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  ndex);.  }.  db-
3560: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
3570: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3580: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68  }../*.** Look th
3590: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f  rough the list o
35a0: 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  f open database 
35b0: 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62  files in db->aDb
35c0: 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79  [] and if.** any
35d0: 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65   have been close
35e0: 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  d, remove them f
35f0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52  rom the list.  R
3600: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a  eallocate the.**
3610: 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63   db->aDb[] struc
3620: 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65  ture to a smalle
3630: 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69  r size, if possi
3640: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79  ble..**.** Entry
3650: 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64   0 (the "main" d
3660: 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74  atabase) and ent
3670: 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22  ry 1 (the "temp"
3680: 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72   database).** ar
3690: 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74  e never candidat
36a0: 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c  es for being col
36b0: 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  lapsed..*/.void 
36c0: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
36d0: 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c  atabaseArray(sql
36e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
36f0: 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
3700: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3710: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3720: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3730: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3740: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
3750: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3760: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  e(db, pDb->zName
3770: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
3780: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
3790: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
37a0: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
37b0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
37c0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
37d0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
37e0: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
37f0: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
3800: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
3810: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
3820: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3830: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3840: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3850: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3860: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
3870: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3880: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3890: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
38a0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
38b0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
38c0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
38d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
38e0: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
38f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
3900: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
3910: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
3920: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
3930: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
3940: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
3950: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
3960: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
3970: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
3980: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
3990: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
39a0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
39b0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
39c0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
39d0: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
39e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
39f0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3a00: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
3a10: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
3a20: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
3a30: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
3a40: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
3a50: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
3a60: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
3a70: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
3a80: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
3a90: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
3aa0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
3ab0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
3ac0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
3ad0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
3ae0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
3af0: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
3b00: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
3b10: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
3b20: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
3b30: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
3b40: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
3b50: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
3b60: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
3b70: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
3b80: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
3b90: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
3ba0: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
3bb0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
3bc0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
3bd0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
3be0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
3bf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
3c00: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
3c10: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
3c20: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
3c30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
3c40: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
3c50: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
3c60: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
3c70: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3c80: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3c90: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
3ca0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
3cb0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
3cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
3cd0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
3ce0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3cf0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
3d00: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
3d10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
3d20: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
3d30: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
3d40: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
3d50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3d60: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3d70: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
3d80: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
3d90: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
3da0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
3db0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
3dc0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
3dd0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
3de0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
3df0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
3e00: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
3e10: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
3e20: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
3e30: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
3e40: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  y)..*/.static vo
3e50: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43  id sqliteDeleteC
3e60: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74  olumnNames(sqlit
3e70: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3e80: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3e90: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3ea0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
3eb0: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
3ec0: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
3ed0: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
3ee0: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
3ef0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
3f00: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
3f10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3f20: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
3f30: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3f40: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
3f50: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
3f60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
3f70: 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->zDflt);.     
3f80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3f90: 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  b, pCol->zType);
3fa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3fb0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
3fc0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
3fd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3fe0: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  b, pTable->aCol)
3ff0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4000: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
4010: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
4020: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4030: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
4040: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
4050: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
4060: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
4070: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
4080: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
4090: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
40a0: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
40b0: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
40c0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
40d0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
40e0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
40f0: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
4100: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
4110: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
4120: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
4130: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
4140: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
4150: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ble..**.** The d
4160: 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  b parameter is o
4170: 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20  ptional.  It is 
4180: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61  needed if the Ta
4190: 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  ble object .** c
41a0: 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64  ontains lookasid
41b0: 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c  e memory.  (Tabl
41c0: 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  e objects in the
41d0: 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75   schema do not u
41e0: 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20  se.** lookaside 
41f0: 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65  memory, but some
4200: 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   ephemeral Table
4210: 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f   objects do.)  O
4220: 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61  r the.** db para
4230: 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65  meter can be use
4240: 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74  d with db->pnByt
4250: 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75  esFreed to measu
4260: 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a  re the memory.**
4270: 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62   used by the Tab
4280: 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  le object..*/.vo
4290: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
42a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
42b0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
42c0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
42d0: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45  ex, *pNext;.  TE
42e0: 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f  STONLY( int nLoo
42f0: 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65  kaside; ) /* Use
4300: 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b  d to verify look
4310: 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66  aside not used f
4320: 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20  or schema */..  
4330: 61 73 73 65 72 74 28 20 21 70 54 61 62 6c 65 20  assert( !pTable 
4340: 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e  || pTable->nRef>
4350: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  0 );..  /* Do no
4360: 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62  t delete the tab
4370: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66  le until the ref
4380: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
4390: 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  ches zero. */.  
43a0: 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65  if( !pTable ) re
43b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64  turn;.  if( ((!d
43c0: 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  b || db->pnBytes
43d0: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d  Freed==0) && (--
43e0: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29  pTable->nRef)>0)
43f0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
4400: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
4410: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
4420: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f  g lookaside allo
4430: 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d  cations in schem
4440: 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72  a Tables.  ** pr
4450: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79  ior to doing any
4460: 20 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f   free() operatio
4470: 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d  ns.  Since schem
4480: 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  a Tables do not 
4490: 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69  use.  ** lookasi
44a0: 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20  de, this number 
44b0: 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67  should not chang
44c0: 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59  e. */.  TESTONLY
44d0: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28  ( nLookaside = (
44e0: 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74  db && (pTable->t
44f0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
4500: 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20  emeral)==0) ?.  
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61         db->looka
4530: 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b  side.nOut : 0 );
4540: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4550: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4560: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
4570: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
4580: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
4590: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
45a0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
45b0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
45c0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
45d0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
45e0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
45f0: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
4600: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ( !db || db->pnB
4610: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
4620: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4630: 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  e = pIndex->zNam
4640: 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e  e; .      TESTON
4650: 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64  LY ( Index *pOld
4660: 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68   = ) sqlite3Hash
4670: 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  Insert(.        
4680: 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d   &pIndex->pSchem
4690: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
46a0: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
46b0: 33 30 28 7a 4e 61 6d 65 29 2c 20 30 0a 20 20 20  30(zName), 0.   
46c0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
46d0: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
46e0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
46f0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
4700: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
4710: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
4720: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
4730: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
4740: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
4750: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
4760: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
4770: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
4780: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
4790: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
47a0: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
47b0: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
47c0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
47d0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
47e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74  */.  sqliteDelet
47f0: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
4800: 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69   pTable);.  sqli
4810: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4820: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
4830: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4840: 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66  , pTable->zColAf
4850: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  f);.  sqlite3Sel
4860: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  ectDelete(db, pT
4870: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
4880: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4890: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69  MIT_CHECK.  sqli
48a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
48b0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43  e(db, pTable->pC
48c0: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 23 69  heck);.#endif.#i
48d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
48e0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
48f0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
4900: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
4910: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
4920: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4930: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
4940: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
4950: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
4960: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
4970: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
4980: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
4990: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d   nLookaside==db-
49a0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
49b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
49c0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
49d0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
49e0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
49f0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
4a00: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
4a10: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
4a20: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4a30: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
4a40: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
4a50: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
4a60: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
4a70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
4a80: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
4a90: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
4aa0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
4ab0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
4ac0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
4ad0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
4ae0: 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  abName );.  asse
4af0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
4b00: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
4b10: 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74  Db, 0) );.  test
4b20: 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30  case( zTabName[0
4b30: 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f  ]==0 );  /* Zero
4b40: 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61  -length table na
4b50: 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  mes are allowed 
4b60: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
4b70: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20  aDb[iDb];.  p = 
4b80: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4b90: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
4ba0: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
4bb0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4bd0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 61 62  te3Strlen30(zTab
4be0: 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71 6c 69  Name),0);.  sqli
4bf0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
4c00: 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  b, p);.  db->fla
4c10: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
4c20: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
4c30: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
4c40: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
4c50: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
4c60: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
4c70: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20   that.** token. 
4c80: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
4c90: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
4ca0: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
4cb0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4cc0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
4cd0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
4ce0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
4cf0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75  on..**.** Any qu
4d00: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65  otation marks (e
4d10: 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d  x:  "name", 'nam
4d20: 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60  e', [name], or `
4d30: 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73  name`) that.** s
4d40: 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79  urround the body
4d50: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72   of the token ar
4d60: 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  e removed..**.**
4d70: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
4d80: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
4d90: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
4da0: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
4db0: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
4dc0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
4dd0: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
4de0: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
4df0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
4e00: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4e10: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
4e20: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
4e30: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4e40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
4e50: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
4e60: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
4e70: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
4e80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
4e90: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
4ea0: 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  r*)pName->z, pNa
4eb0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
4ec0: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
4ed0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4ee0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
4ef0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
4f00: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
4f10: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
4f20: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
4f30: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
4f40: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
4f50: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
4f60: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
4f70: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
4f80: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
4f90: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
4fa0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
4fb0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
4fc0: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
4fd0: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
4fe0: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
4ff0: 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45   1, SCHEMA_TABLE
5000: 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  (iDb));.  sqlite
5010: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5020: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
5030: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62  MASTER_ROOT, iDb
5040: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5050: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
5060: 28 63 68 61 72 20 2a 29 35 2c 20 50 34 5f 49 4e  (char *)5, P4_IN
5070: 54 33 32 29 3b 20 20 2f 2a 20 35 20 63 6f 6c 75  T32);  /* 5 colu
5080: 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66  mn table */.  if
5090: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
50a0: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
50b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
50c0: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
50d0: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
50e0: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
50f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5100: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5110: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5120: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5130: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5140: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5150: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5160: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5170: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5180: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5190: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
51a0: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
51b0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
51c0: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
51d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
51e0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
51f0: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5200: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5210: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5220: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5230: 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20  b *pDb;.    int 
5240: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5250: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
5260: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
5270: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
5280: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
5290: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
52a0: 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c   (!OMIT_TEMPDB |
52b0: 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73  | i!=1 ) && n==s
52c0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
52d0: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  Db->zName) && . 
52e0: 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
52f0: 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e  te3StrICmp(pDb->
5300: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  zName, zName) ){
5310: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5320: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5330: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
5340: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
5350: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
5360: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
5370: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
5380: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
5390: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
53a0: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
53b0: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
53c0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
53d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
53e0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
53f0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
5400: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5410: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
5420: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
5430: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
5440: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5450: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5480: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
5490: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
54c0: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
54d0: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
54e0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
54f0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
5500: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
5510: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
5520: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
5530: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
5540: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
5550: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
5560: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
5570: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
5580: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5590: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
55a0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
55b0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
55c0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
55d0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
55e0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
55f0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5600: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
5610: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5620: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5630: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5640: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5650: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
5660: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
5670: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
5680: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
5690: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
56a0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
56b0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
56c0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
56d0: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
56e0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
56f0: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
5700: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5710: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5720: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
5730: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
5740: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
5750: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
5760: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5770: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
5780: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
5790: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
57a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
57b0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
57c0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
57d0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
57e0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
57f0: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
5800: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
5810: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
5820: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
5830: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
5840: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
5850: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
5860: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
5870: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
5880: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
5890: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
58a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
58b0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
58c0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
58d0: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
58e0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
58f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5900: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  >db;..  if( ALWA
5910: 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26  YS(pName2!=0) &&
5920: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5930: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5940: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5950: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5960: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5970: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5980: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5990: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
59a0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
59b0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
59c0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
59d0: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
59e0: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
59f0: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
5a00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5a10: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
5a20: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
5a30: 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e1);.      pPars
5a40: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5a50: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5a60: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
5a70: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
5a80: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
5a90: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
5aa0: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
5ab0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
5ac0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
5ad0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
5ae0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5af0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
5b00: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
5b10: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
5b20: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
5b30: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
5b40: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
5b50: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
5b60: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
5b70: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
5b80: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
5b90: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
5ba0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
5bb0: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
5bc0: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
5bd0: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
5be0: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
5bf0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
5c00: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
5c10: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
5c20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
5c30: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
5c40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
5c50: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5c60: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
5c70: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
5c80: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
5c90: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
5ca0: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
5cb0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
5cc0: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
5cd0: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
5ce0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
5cf0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
5d00: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
5d10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5d20: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
5d30: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
5d40: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
5d50: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
5d60: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
5d70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5d80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5d90: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
5da0: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
5db0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
5dc0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
5dd0: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
5de0: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
5df0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
5e00: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
5e10: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
5e20: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
5e30: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
5e40: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
5e50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
5e60: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
5e70: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
5e80: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
5e90: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
5ea0: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
5eb0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
5ec0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
5ed0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
5ee0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
5ef0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
5f00: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
5f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
5f20: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
5f30: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
5f40: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
5f50: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
5f60: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
5f70: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
5f80: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
5f90: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
5fa0: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
5fb0: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
5fc0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
5fd0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
5fe0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
5ff0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
6000: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
6010: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
6020: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
6030: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
6040: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
6050: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
6060: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
6070: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6080: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
6090: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
60a0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
60b0: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
60c0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
60d0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
60e0: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
60f0: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
6100: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
6110: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
6120: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
6130: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
6140: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
6150: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6160: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6170: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6180: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
6190: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
61a0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
61b0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
61c0: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
61d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
61e0: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
61f0: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
6200: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6210: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
6220: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
6230: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6240: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
6250: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
6260: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
6270: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
6280: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6290: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
62a0: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
62b0: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
62c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
62d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
62e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
62f0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
6300: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6310: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6320: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6330: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6340: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6350: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6360: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6370: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6380: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
6390: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
63a0: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
63b0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
63c0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
63d0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
63e0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
63f0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
6400: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
6410: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
6420: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
6430: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
6440: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
6450: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6460: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
6470: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
6480: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
6490: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
64a0: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
64b0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
64c0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
64d0: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
64e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
64f0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6500: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
6510: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
6520: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
6530: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
6540: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
6550: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
6560: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
6570: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
6580: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
6590: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
65a0: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
65b0: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
65c0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
65d0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
65e0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
65f0: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
6600: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
6610: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6620: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6630: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6640: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
6650: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
6660: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
6670: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
6680: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20   pName2->n>0 && 
6690: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  iDb!=1 ){.    /*
66a0: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
66b0: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
66c0: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
66d0: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
66e0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74   .    ** the dat
66f0: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
6700: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
6710: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6720: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
6730: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
6740: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
6750: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
6760: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6770: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6780: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
6790: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
67a0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
67b0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
67c0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
67d0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
67e0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
67f0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6800: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6810: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6820: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6830: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6840: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6850: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6860: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6870: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6880: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6890: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
68a0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
68b0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
68c0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
68d0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
68e0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
68f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
6900: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
6910: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
6920: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
6930: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
6940: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
6950: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
6960: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
6970: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
6980: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
6990: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
69a0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
69b0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
69c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
69d0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
69e0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
69f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6a00: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
6a10: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6a20: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
6a30: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6a40: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
6a50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6a60: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6a70: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
6a80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6a90: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
6aa0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
6ab0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
6ac0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
6ad0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
6ae0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6af0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
6b00: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
6b10: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
6b20: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
6b30: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
6b40: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
6b50: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
6b60: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
6b70: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
6b80: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
6b90: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
6ba0: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
6bb0: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
6bc0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
6bd0: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
6be0: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
6bf0: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
6c00: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
6c10: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
6c20: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
6c30: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
6c40: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
6c50: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
6c60: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
6c70: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
6c80: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
6c90: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
6ca0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
6cb0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
6cc0: 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  e;.    if( SQLIT
6cd0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
6ce0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6cf0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6d00: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6d10: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
6d20: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
6d30: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
6d40: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
6d50: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
6d60: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
6d70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6d80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
6d90: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
6da0: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
6db0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6dc0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
6dd0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
6de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
6df0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
6e00: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
6e10: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
6e20: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6e30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6e40: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
6e50: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
6e60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
6e70: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6e80: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
6e90: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
6ea0: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
6eb0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
6ec0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6ed0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
6ee0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
6ef0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
6f00: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
6f10: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
6f20: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
6f30: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
6f40: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
6f50: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
6f60: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
6f70: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6f80: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
6f90: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
6fa0: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
6fb0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
6fc0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
6fd0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
6fe0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
6ff0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
7000: 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  able->nRowEst = 
7010: 31 30 30 30 30 30 30 3b 0a 20 20 61 73 73 65 72  1000000;.  asser
7020: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
7030: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61  able==0 );.  pPa
7040: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
7050: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
7060: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
7070: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
7080: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
7090: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
70a0: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
70b0: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
70c0: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
70d0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
70e0: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
70f0: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
7100: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
7110: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
7120: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7130: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
7140: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
7150: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
7160: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
7170: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
7180: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7190: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
71a0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
71b0: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
71c0: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
71d0: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
71e0: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
71f0: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
7200: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
7210: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
7220: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
7230: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
7240: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
7250: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
7260: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
7270: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
7280: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
7290: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
72a0: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
72b0: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
72c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
72d0: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
72e0: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
72f0: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
7300: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
7310: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
7320: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
7330: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
7340: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
7350: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
7360: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
7370: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7380: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
7390: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
73a0: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
73b0: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
73c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
73d0: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
73e0: 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e    int j1;.    in
73f0: 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20  t fileFormat;.  
7400: 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32    int reg1, reg2
7410: 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c 69  , reg3;.    sqli
7420: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
7430: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
7440: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
7450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7460: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
7470: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
7480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7490: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
74a0: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
74b0: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
74c0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
74d0: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
74e0: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
74f0: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
7500: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
7510: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
7520: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
7530: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
7540: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7550: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
7560: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
7570: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
7580: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7590: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
75a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
75b0: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
75c0: 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  g3, BTREE_FILE_F
75d0: 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69  ORMAT);.    sqli
75e0: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
75f0: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a 31  (v, iDb);.    j1
7600: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7610: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
7620: 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  eg3);.    fileFo
7630: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
7640: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
7650: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f   1 : SQLITE_MAX_
7680: 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20  FILE_FORMAT;.   
7690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
76a0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
76b0: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72 65  , fileFormat, re
76c0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
76d0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
76e0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
76f0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
7700: 41 54 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  AT, reg3);.    s
7710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7720: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
7730: 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b 0a  ENC(db), reg3);.
7740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7750: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
7760: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
7770: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c  E_TEXT_ENCODING,
7780: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7790: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
77a0: 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  v, j1);..    /* 
77b0: 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65  This just create
77c0: 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  s a place-holder
77d0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73   record in the s
77e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
77f0: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  le..    ** The r
7800: 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f  ecord created do
7810: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
7820: 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74  nything yet.  It
7830: 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65   will be replace
7840: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
7850: 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f  real entry in co
7860: 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20  de generated at 
7870: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
7880: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
7890: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
78a0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
78b0: 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
78c0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
78d0: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  d..    ** The ro
78e0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
78f0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
7900: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70  is left in reg p
7910: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
7920: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
7930: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e   and root page n
7940: 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65  umber values are
7950: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
7960: 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ode that.    ** 
7970: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20  sqlite3EndTable 
7980: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
7990: 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e     */.#if !defin
79a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
79b0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
79c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
79d0: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69  TUALTABLE).    i
79e0: 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56  f( isView || isV
79f0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
7a00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7a10: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
7a20: 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d   0, reg2);.    }
7a30: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
7a40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7a50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7a60: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62  CreateTable, iDb
7a70: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20  , reg2);.    }. 
7a80: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
7a90: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
7aa0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
7ab0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7ac0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c   OP_NewRowid, 0,
7ad0: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
7ae0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7af0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
7b00: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
7b10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7b20: 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c  Insert, 0, reg3,
7b30: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
7b40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7b50: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7b60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7b70: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
7b80: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lose);.  }..  /*
7b90: 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72   Normal (non-err
7ba0: 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  or) return. */. 
7bb0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
7bc0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7bd0: 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20  s, we jump here 
7be0: 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  */.begin_table_e
7bf0: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
7c00: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
7c10: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
7c20: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
7c30: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  is used to compa
7c40: 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69  re two strings i
7c50: 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  n a case-insensi
7c60: 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20  tive manner..** 
7c70: 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66  It is slightly f
7c80: 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69  aster than calli
7c90: 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  ng sqlite3StrICm
7ca0: 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75  p() directly, bu
7cb0: 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61  t.** produces la
7cc0: 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rger code..**.**
7cd0: 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d   WARNING: This m
7ce0: 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70  acro is not comp
7cf0: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20  atible with the 
7d00: 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e  strcmp() family.
7d10: 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74   It.** returns t
7d20: 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73  rue if the two s
7d30: 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c  trings are equal
7d40: 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73  , otherwise fals
7d50: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  e..*/.#define ST
7d60: 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73  RICMP(x, y) (\.s
7d70: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7d80: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
7d90: 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a  ar *)(x)]==   \.
7da0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
7db0: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
7dc0: 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c  har *)(y)]     \
7dd0: 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43  .&& sqlite3StrIC
7de0: 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d  mp((x)+1,(y)+1)=
7df0: 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  =0 )../*.** Add 
7e00: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
7e10: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
7e20: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
7e30: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
7e40: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
7e50: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
7e60: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
7e70: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
7e80: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
7e90: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
7ea0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
7eb0: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
7ec0: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
7ed0: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
7ee0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7ef0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
7f00: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
7f10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
7f20: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
7f30: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
7f40: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
7f50: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
7f60: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
7f70: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
7f80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7f90: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
7fa0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
7fb0: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51  ) return;.#if SQ
7fc0: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
7fd0: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
7fe0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7ff0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8000: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8010: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8020: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
8030: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
8040: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
8050: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d    }.#endif.  z =
8060: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
8070: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
8080: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
8090: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
80a0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
80b0: 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43  ){.    if( STRIC
80c0: 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  MP(z, p->aCol[i]
80d0: 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  .zName) ){.     
80e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
80f0: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
8100: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
8110: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
8120: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8130: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
8140: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
8150: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
8160: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
8170: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
8180: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
8190: 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43  Realloc(db,p->aC
81a0: 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  ol,(p->nCol+8)*s
81b0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
81c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
81d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
81e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
81f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8200: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43  .    }.    p->aC
8210: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
8220: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
8230: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
8240: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
8250: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8260: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
8270: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
8280: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8290: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
82a0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
82b0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
82c0: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
82d0: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
82e0: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
82f0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
8300: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
8310: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
8320: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
8330: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
8340: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
8350: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
8360: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  _NONE;.  p->nCol
8370: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ++;.}../*.** Thi
8380: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8390: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
83a0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
83b0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
83c0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
83d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
83e0: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
83f0: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
8400: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
8410: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
8420: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
8430: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
8440: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
8450: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8460: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8470: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
8480: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
8490: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
84a0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
84b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
84c0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
84d0: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
84e0: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
84f0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8500: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29  ].notNull = (u8)
8510: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
8520: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
8530: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
8540: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
8550: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
8560: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
8570: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
8580: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8590: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
85a0: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
85b0: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
85c0: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
85d0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
85e0: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
85f0: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
8600: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
8610: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
8620: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
8630: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
8640: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
8650: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
8660: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
8670: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
8680: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
8690: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
86a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
86b0: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
86c0: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
86d0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
86e0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
86f0: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
8700: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
8730: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
8740: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
8750: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
8760: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8770: 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
8780: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8790: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58  AFF_TEXT.** 'TEX
87a0: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
87b0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
87c0: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
87d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a  QLITE_AFF_NONE.*
87e0: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
87f0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8800: 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
8810: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8820: 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
8830: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8840: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
8850: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
8860: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
8870: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
8880: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
8890: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
88a0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
88b0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
88c0: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
88d0: 2a 7a 49 6e 29 7b 0a 20 20 75 33 32 20 68 20 3d  *zIn){.  u32 h =
88e0: 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d   0;.  char aff =
88f0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
8900: 52 49 43 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 20  RIC;..  if( zIn 
8910: 29 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20  ) while( zIn[0] 
8920: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
8930: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
8940: 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30  ToLower[(*zIn)&0
8950: 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  xff];.    zIn++;
8960: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
8970: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
8980: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
8990: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
89a0: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
89b0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
89c0: 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65  TEXT; .    }else
89d0: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
89e0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
89f0: 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20  '<<8)+'b') ){   
8a00: 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20      /* CLOB */. 
8a10: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8a20: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
8a30: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8a40: 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  t'<<24)+('e'<<16
8a50: 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20  )+('x'<<8)+'t') 
8a60: 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54  ){       /* TEXT
8a70: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
8a80: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
8a90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8aa0: 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c  ==(('b'<<24)+('l
8ab0: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
8ac0: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
8ad0: 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20   BLOB */.       
8ae0: 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45   && (aff==SQLITE
8af0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
8b00: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8b10: 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61  REAL) ){.      a
8b20: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8b30: 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  NONE;.#ifndef SQ
8b40: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
8b50: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
8b60: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
8b70: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
8b80: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
8b90: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
8ba0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
8bb0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8bc0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8bd0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8be0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8bf0: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
8c00: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8c10: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
8c20: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
8c30: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8c40: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8c50: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8c60: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
8c70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8c80: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
8c90: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
8ca0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
8cb0: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
8cc0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
8cd0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
8ce0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8cf0: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
8d00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
8d10: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
8d20: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
8d30: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
8d40: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
8d50: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
8d60: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
8d70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
8d80: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
8d90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8da0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8db0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8dc0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8dd0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8de0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8df0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
8e00: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
8e10: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
8e20: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
8e30: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
8e40: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
8e50: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
8e60: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
8e70: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
8e80: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
8e90: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
8ea0: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
8eb0: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
8ec0: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
8ed0: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
8ee0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
8ef0: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
8f00: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
8f10: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
8f20: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
8f30: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8f40: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
8f50: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  arse, Token *pTy
8f60: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
8f70: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
8f80: 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ..  p = pParse->
8f90: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
8fa0: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
8fb0: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
8fc0: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
8fd0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
8fe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ;.  assert( pCol
8ff0: 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20  ->zType==0 );.  
9000: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
9010: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
9020: 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
9030: 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61  Type);.  pCol->a
9040: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
9050: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 43  3AffinityType(pC
9060: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f  ol->zType);.}../
9070: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
9080: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9090: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
90a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
90b0: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
90c0: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
90d0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
90e0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
90f0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9100: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9110: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9120: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
9130: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
9140: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
9150: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9160: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9170: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9180: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9190: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
91a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
91b0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
91c0: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
91d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
91e0: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
91f0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9200: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9210: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9220: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
9230: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9240: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
9250: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
9260: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
9270: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
9280: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9290: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
92a0: 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20 20  an->pExpr) ){.  
92b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
92c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
92d0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
92e0: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
92f0: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
9300: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
9310: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9320: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
9330: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
9340: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
9350: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
9360: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
9370: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
9380: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
9390: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
93a0: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
93b0: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
93c0: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
93d0: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
93e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
93f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9400: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
9410: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
9420: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
9430: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61  ExprDup(db, pSpa
9440: 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55  n->pExpr, EXPRDU
9450: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
9460: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9470: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
9480: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66  .      pCol->zDf
9490: 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  lt = sqlite3DbSt
94a0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
94b0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
94f0: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
9500: 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a  zStart));.    }.
9510: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
9520: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61  rDelete(db, pSpa
9530: 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  n->pExpr);.}../*
9540: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
9550: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
9560: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
9570: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
9580: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
9590: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
95a0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
95b0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
95c0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
95d0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
95e0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
95f0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
9600: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
9610: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
9620: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
9630: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
9640: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
9650: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
9660: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
9670: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
9680: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
9690: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
96a0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
96b0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
96c0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
96d0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
96e0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
96f0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
9700: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
9710: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
9720: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
9730: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
9740: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
9750: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9760: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
9770: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
9780: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
9790: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
97a0: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
97b0: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
97c0: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
97d0: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
97e0: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
97f0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
9800: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
9810: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
9820: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
9830: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
9840: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
9850: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9860: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
9870: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
9880: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9890: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
98a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
98b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
98c0: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
98d0: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
98e0: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
98f0: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
9900: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
9910: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
9920: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
9930: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
9940: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
9950: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
9960: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
9970: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
9980: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
9990: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
99a0: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
99b0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
99c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
99d0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
99e0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
99f0: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
9a00: 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
9a10: 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69  _VTAB ) goto pri
9a20: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
9a30: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
9a40: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
9a50: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
9a60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9a70: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
9a80: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
9a90: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
9aa0: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
9ab0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
9ac0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
9ad0: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
9ae0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
9af0: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
9b00: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9b10: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
9b20: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
9b30: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9b40: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
9b50: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 7d  LAG_PRIMKEY;.  }
9b60: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
9b70: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
9b80: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  r; i++){.      f
9b90: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
9ba0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
9bb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
9bc0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9bd0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
9be0: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
9bf0: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
9c00: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
9c10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9c20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
9c30: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
9c40: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
9c50: 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61  Col[iCol].colFla
9c60: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
9c70: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 7d 0a 20  IMKEY;.      }. 
9c80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
9c90: 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29 20 69 43  st->nExpr>1 ) iC
9ca0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69  ol = -1;.  }.  i
9cb0: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
9cc0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
9cd0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61  .    zType = pTa
9ce0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
9cf0: 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ype;.  }.  if( z
9d00: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
9d10: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
9d20: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
9d30: 20 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72      && sortOrder
9d40: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
9d50: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
9d60: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
9d70: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
9d80: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
9d90: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
9da0: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
9db0: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
9dc0: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
9dd0: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
9de0: 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  nt;.  }else if( 
9df0: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
9e00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
9e10: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
9e20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9e30: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
9e40: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
9e50: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
9e60: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
9e70: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
9e80: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
9e90: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
9ea0: 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61   p = sqlite3Crea
9eb0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
9ec0: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
9ed0: 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20  onError, 0,.    
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72         0, sortOr
9f00: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  der, 0);.    if(
9f10: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61   p ){.      p->a
9f20: 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  utoIndex = 2;.  
9f30: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
9f40: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
9f50: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
9f60: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9f70: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
9f80: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
9f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
9fa0: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
9fb0: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
9fc0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9fd0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9fe0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9ff0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
a000: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a010: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
a020: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
a030: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
a040: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
a050: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69  ression */.){.#i
a060: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a070: 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20  T_CHECK.  Table 
a080: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
a090: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
a0a0: 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43   pTab && !IN_DEC
a0b0: 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20  LARE_VTAB ){.   
a0c0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20   pTab->pCheck = 
a0d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
a0e0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54  ppend(pParse, pT
a0f0: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65  ab->pCheck, pChe
a100: 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ckExpr);.    if(
a110: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
a120: 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20  intName.n ){.   
a130: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
a140: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
a150: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
a160: 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61  &pParse->constra
a170: 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  intName, 1);.   
a180: 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
a190: 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
a1a0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
a1b0: 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78  se->db, pCheckEx
a1c0: 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pr);.  }.}../*.*
a1d0: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
a1e0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
a1f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
a200: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
a210: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
a220: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
a230: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
a240: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
a250: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
a260: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61  n *pToken){.  Ta
a270: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
a280: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  .  char *zColl; 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2a0: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
a2b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
a2c0: 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nce */.  sqlite3
a2d0: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20   *db;..  if( (p 
a2e0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
a2f0: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
a300: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
a310: 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  1;.  db = pParse
a320: 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20  ->db;.  zColl = 
a330: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
a340: 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
a350: 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29  ;.  if( !zColl )
a360: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
a370: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
a380: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
a390: 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ll) ){.    Index
a3a0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69   *pIdx;.    sqli
a3b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
a3c0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b  >aCol[i].zColl);
a3d0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
a3e0: 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  zColl = zColl;. 
a3f0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
a400: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
a410: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
a420: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
a430: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a  E <type>",.    *
a440: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
a450: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
a460: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
a470: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
a480: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
a490: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
a4a0: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
a4b0: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
a4c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
a4d0: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
a4e0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
a4f0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
a500: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
a510: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
a520: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
a530: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20  umn[0]==i ){.   
a540: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
a550: 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69  l[0] = p->aCol[i
a560: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ].zColl;.      }
a570: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
a580: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a590: 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
a5a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
a5b0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a5c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
a5d0: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
a5e0: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
a5f0: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
a600: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
a610: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
a620: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
a630: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
a640: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
a650: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
a660: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
a670: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
a680: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
a690: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
a6a0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
a6b0: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
a6c0: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
a6d0: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
a6e0: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
a6f0: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
a700: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
a710: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
a720: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
a730: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
a740: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
a750: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
a760: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
a770: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
a780: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
a790: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
a7a0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
a7b0: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
a7c0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
a7d0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
a7e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a7f0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
a800: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   pParse..**.** T
a810: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
a820: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
a830: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
a840: 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  eq().  This rout
a850: 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74  ine.** invokes t
a860: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
a870: 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65  tory if the name
a880: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e  d collation cann
a890: 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61  ot be found.** a
a8a0: 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  nd generates an 
a8b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
a8c0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
a8d0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
a8e0: 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43  q(), sqlite3GetC
a8f0: 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c  ollSeq().*/.Coll
a900: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
a910: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
a920: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
a930: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
a940: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a950: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
a960: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
a970: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
a980: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
a990: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
a9a0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
a9b0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
a9c0: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74  enc, zName, init
a9d0: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
a9e0: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
a9f0: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
aa00: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
aa10: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
aa20: 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c  Seq(pParse, enc,
aa30: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a   pColl, zName);.
aa40: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
aa50: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
aa60: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
aa70: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
aa80: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
aa90: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
aaa0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
aab0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
aac0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
aad0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
aae0: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
aaf0: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
ab00: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
ab10: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
ab20: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
ab30: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
ab40: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
ab50: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
ab60: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
ab70: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
ab80: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
ab90: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
aba0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
abb0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
abc0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
abd0: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
abe0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
abf0: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
ac00: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
ac10: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
ac20: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
ac30: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
ac40: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
ac50: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
ac60: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
ac70: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
ac80: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
ac90: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
aca0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
acb0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
acc0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
acd0: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
ace0: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
acf0: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
ad00: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
ad10: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
ad20: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
ad30: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
ad40: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
ad50: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
ad60: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
ad70: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ad80: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ad90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ada0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
adb0: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
adc0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
add0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
ade0: 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  b, 0) );.  sqlit
adf0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ae00: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
ae10: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
ae20: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ->schema_cookie+
ae30: 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  1, r1);.  sqlite
ae40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ae50: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
ae60: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
ae70: 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73  ERSION, r1);.  s
ae80: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ae90: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
aea0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
aeb0: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
aec0: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
aed0: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
aee0: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
aef0: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
af00: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
af10: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
af20: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
af30: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
af40: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
af50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
af60: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
af70: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
af80: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
af90: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
afa0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
afb0: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
afc0: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
afd0: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
afe0: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
aff0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
b000: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
b010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
b020: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
b030: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
b040: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
b050: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
b060: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
b070: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
b080: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
b090: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
b0a0: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
b0b0: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
b0c0: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
b0d0: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
b0e0: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
b0f0: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
b100: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
b110: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
b120: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
b130: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
b140: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
b150: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
b160: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
b170: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
b180: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
b190: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
b1a0: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
b1b0: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
b1c0: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
b1d0: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
b1e0: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
b1f0: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
b200: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
b210: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
b220: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
b230: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
b240: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
b250: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
b260: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
b270: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
b280: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
b290: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
b2a0: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
b2b0: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
b2c0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
b2d0: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
b2e0: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
b2f0: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
b300: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
b310: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
b320: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
b330: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
b340: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
b350: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
b360: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
b370: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
b380: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
b390: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
b3a0: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
b3b0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
b3c0: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
b3d0: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
b3e0: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
b3f0: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
b400: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
b410: 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20  !needQuote ){.  
b420: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49    needQuote = zI
b430: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20  dent[j];.  }..  
b440: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
b450: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
b460: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
b470: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
b480: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
b490: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
b4a0: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
b4b0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
b4c0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
b4d0: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
b4e0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
b4f0: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
b500: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
b510: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b520: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
b530: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
b540: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
b550: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
b560: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
b570: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
b580: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
b590: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
b5a0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
b5b0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
b5c0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
b5d0: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
b5e0: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
b5f0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
b600: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
b610: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
b620: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
b630: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
b640: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
b650: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
b660: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
b670: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
b680: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
b690: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
b6a0: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
b6b0: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
b6c0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
b6d0: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
b6e0: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
b6f0: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
b700: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
b710: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
b720: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
b730: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
b740: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
b750: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
b760: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
b770: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
b780: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
b790: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  mt==0 ){.    db-
b7a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
b7b0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
b7c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
b7d0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
b7e0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
b7f0: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
b800: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
b810: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
b820: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
b830: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
b840: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
b850: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
b860: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
b870: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
b880: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
b890: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
b8a0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
b8b0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
b8c0: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
b8d0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
b8e0: 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22  AFF_NONE    */ "
b8f0: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
b900: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
b910: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
b920: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
b930: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
b940: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
b950: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
b960: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
b970: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
b980: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
b990: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
b9a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
b9b0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
b9c0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
b9d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
b9e0: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
b9f0: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
ba00: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
ba10: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
ba20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ba30: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
ba40: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d  LITE_AFF_TEXT >=
ba50: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
ba60: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
ba70: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  -SQLITE_AFF_TEXT
ba80: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54   < ArraySize(azT
ba90: 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74  ype) );.    test
baa0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
bab0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
bac0: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
bad0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
bae0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
baf0: 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65  F_NONE );.    te
bb00: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
bb10: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
bb20: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
bb30: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
bb40: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
bb50: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
bb60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
bb70: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
bb80: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
bb90: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
bba0: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
bbb0: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
bbc0: 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20  TE_AFF_TEXT];.  
bbd0: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
bbe0: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
bbf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
bc00: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
bc10: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20  TE_AFF_NONE .   
bc20: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
bc30: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
bc40: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
bc50: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 6d 65  zType) );.    me
bc60: 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  mcpy(&zStmt[k], 
bc70: 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zType, len);.   
bc80: 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61   k += len;.    a
bc90: 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20  ssert( k<=n );. 
bca0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
bcb0: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
bcc0: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64  t[k], "%s", zEnd
bcd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
bce0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
bcf0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
bd00: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
bd10: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
bd20: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
bd30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
bd40: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
bd50: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
bd60: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
bd70: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
bd80: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
bd90: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
bda0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
bdb0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
bdc0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
bdd0: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
bde0: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
bdf0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
be00: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
be10: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
be20: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
be30: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
be40: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
be50: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
be60: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
be70: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
be80: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
be90: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
bea0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
beb0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
bec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
bed0: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
bee0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
bef0: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
bf00: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
bf10: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
bf20: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
bf30: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
bf40: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
bf50: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
bf60: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
bf70: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
bf80: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
bf90: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
bfa0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
bfb0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
bfc0: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
bfd0: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
bfe0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
bff0: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
c000: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
c010: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
c020: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
c030: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
c040: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
c050: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
c060: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
c070: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
c080: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
c090: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c0a0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
c0b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
c0c0: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
c0d0: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
c0e0: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
c0f0: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
c100: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
c110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c120: 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65  e final ')' toke
c130: 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  n in the CREATE 
c140: 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63  TABLE */.  Selec
c150: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
c160: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
c170: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
c180: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
c190: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73  .  Table *p;.  s
c1a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
c1b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
c1c0: 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  Db;..  if( (pEnd
c1d0: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
c1e0: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
c1f0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
c200: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  turn;.  }.  p = 
c210: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c220: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
c230: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
c240: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
c250: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
c260: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
c270: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
c280: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
c290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c2a0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
c2b0: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
c2c0: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
c2d0: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
c2e0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
c2f0: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
c300: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
c310: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
c320: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
c330: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
c340: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
c350: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
c360: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
c370: 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
c380: 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74  nit.busy is 1 it
c390: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
c3a0: 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66  ading the SQL of
c3b0: 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69  f the.  ** "sqli
c3c0: 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73  te_master" or "s
c3d0: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
c3e0: 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  r" table on the 
c3f0: 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f  disk..  ** So do
c400: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
c410: 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45  e disk again.  E
c420: 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20  xtract the root 
c430: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
c440: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66   for the table f
c450: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74  rom the db->init
c460: 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20  .newTnum field. 
c470: 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (The page numbe
c480: 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  r.  ** should ha
c490: 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72  ve been put ther
c4a0: 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f  e by the sqliteO
c4b0: 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a  penCb routine.).
c4c0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
c4d0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
c4e0: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
c4f0: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a  it.newTnum;.  }.
c500: 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69  .  /* If not ini
c510: 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20  tializing, then 
c520: 63 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20  create a record 
c530: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
c540: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51  e.  ** in the SQ
c550: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
c560: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
c570: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
c580: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52  this is a TEMPOR
c590: 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65  ARY table, write
c5a0: 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20   the entry into 
c5b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20  the auxiliary.  
c5c0: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
c5d0: 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  of into the main
c5e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
c5f0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
c600: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
c610: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65   int n;.    Vdbe
c620: 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
c630: 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65  Type;    /* "vie
c640: 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f  w" or "table" */
c650: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
c660: 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f  2;   /* "VIEW" o
c670: 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20  r "TABLE" */.   
c680: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20   char *zStmt;   
c690: 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
c6a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20  CREATE TABLE or 
c6b0: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
c6c0: 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20  ement */..    v 
c6d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
c6e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
c6f0: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
c700: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c  return;..    sql
c710: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c720: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a  , OP_Close, 0);.
c730: 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20  .    /* .    ** 
c740: 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65  Initialize zType
c750: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65   for the new vie
c760: 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  w or table..    
c770: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  */.    if( p->pS
c780: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
c790: 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74    /* A regular t
c7a0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54  able */.      zT
c7b0: 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20  ype = "table";. 
c7c0: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54       zType2 = "T
c7d0: 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53  ABLE";.#ifndef S
c7e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
c7f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c800: 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20   /* A view */.  
c810: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65      zType = "vie
c820: 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  w";.      zType2
c830: 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69   = "VIEW";.#endi
c840: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
c850: 49 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45  If this is a CRE
c860: 41 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20  ATE TABLE xx AS 
c870: 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63  SELECT ..., exec
c880: 75 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20  ute the SELECT. 
c890: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
c8a0: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
c8b0: 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72  new table. The r
c8c0: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
c8d0: 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  for the.    ** n
c8e0: 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72  ew table is in r
c8f0: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
c900: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a  regRoot..    **.
c910: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
c920: 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
c930: 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33  coded by sqlite3
c940: 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20  Select(), it is 
c950: 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74  in a.    ** suit
c960: 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75  able state to qu
c970: 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ery for the colu
c980: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70  mn names and typ
c990: 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20  es to be used.  
c9a0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20    ** by the new 
c9b0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
c9c0: 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61    ** A shared-ca
c9d0: 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69  che write-lock i
c9e0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
c9f0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
ca00: 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a  ew table,.    **
ca10: 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   as a schema-loc
ca20: 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  k must have alre
ca30: 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ady been obtaine
ca40: 64 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20  d to create it. 
ca50: 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73  Since.    ** a s
ca60: 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75  chema-lock exclu
ca70: 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61  des all other da
ca80: 74 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68  tabase users, th
ca90: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75  e write-lock wou
caa0: 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64  ld.    ** be red
cab0: 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  undant..    */. 
cac0: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
cad0: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  {.      SelectDe
cae0: 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 54  st dest;.      T
caf0: 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a  able *pSelTab;..
cb00: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
cb10: 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20  rse->nTab==1);. 
cb20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cb30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
cb40: 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73  nWrite, 1, pPars
cb50: 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29  e->regRoot, iDb)
cb60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cb70: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
cb80: 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29 3b 0a  PFLAG_P2ISREG);.
cb90: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
cba0: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
cbb0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
cbc0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54  nit(&dest, SRT_T
cbd0: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  able, 1);.      
cbe0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
cbf0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
cc00: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
cc10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
cc20: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
cc30: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
cc40: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
cc50: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
cc60: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
cc70: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
cc80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
cc90: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
cca0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
ccb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
ccc0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
ccd0: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
cce0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
ccf0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
cd00: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
cd10: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
cd20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
cd30: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
cd40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cd50: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
cd60: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
cd70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
cd80: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
cd90: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
cda0: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
cdb0: 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  t */.    if( pSe
cdc0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53  lect ){.      zS
cdd0: 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c  tmt = createTabl
cde0: 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20  eStmt(db, p);.  
cdf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
ce00: 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 2d 3e 7a   = (int)(pEnd->z
ce10: 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   - pParse->sName
ce20: 54 6f 6b 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20  Token.z) + 1;.  
ce30: 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
ce40: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a  te3MPrintf(db, .
ce50: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
ce60: 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70  E %s %.*s", zTyp
ce70: 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73  e2, n, pParse->s
ce80: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20  NameToken.z.    
ce90: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
cea0: 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68  /* A slot for th
ceb0: 65 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72  e record has alr
cec0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
ced0: 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ted in the .    
cee0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ** SQLITE_MASTER
cef0: 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74   table.  We just
cf00: 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20   need to update 
cf10: 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61  that slot with a
cf20: 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  ll.    ** the in
cf30: 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20  formation we've 
cf40: 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a  collected..    *
cf50: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
cf60: 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
cf70: 0a 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25  .      "UPDATE %
cf80: 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20  Q.%s ".         
cf90: 22 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20  "SET type='%s', 
cfa0: 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d  name=%Q, tbl_nam
cfb0: 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23  e=%Q, rootpage=#
cfc0: 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20  %d, sql=%Q ".   
cfd0: 20 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64      "WHERE rowid
cfe0: 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d  =#%d",.      db-
cff0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
d000: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
d010: 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c  b),.      zType,
d020: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
d030: 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c  .      p->zName,
d040: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
d050: 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53  egRoot,.      zS
d060: 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73  tmt,.      pPars
d070: 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20  e->regRowid.    
d080: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
d090: 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
d0a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
d0b0: 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
d0c0: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
d0d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d0e0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
d0f0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
d100: 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61   we need to crea
d110: 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71  te an sqlite_seq
d120: 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a  uence table for.
d130: 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74      ** keeping t
d140: 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72  rack of autoincr
d150: 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20  ement keys..    
d160: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61  */.    if( p->ta
d170: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
d180: 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
d190: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
d1a0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
d1b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d1c0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
d1d0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
d1e0: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70        if( pDb->p
d1f0: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d  Schema->pSeqTab=
d200: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
d210: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
d220: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
d230: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
d240: 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
d250: 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a  nce(name,seq)",.
d260: 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a            pDb->z
d270: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Name.        );.
d280: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
d290: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70  ndif..    /* Rep
d2a0: 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20  arse everything 
d2b0: 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e  to update our in
d2c0: 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75  ternal data stru
d2d0: 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71  ctures */.    sq
d2e0: 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
d2f0: 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
d300: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d310: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
d320: 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25  db, "tbl_name='%
d330: 71 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  q'", p->zName));
d340: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
d350: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
d360: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
d370: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
d380: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
d390: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
d3a0: 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
d3b0: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
d3c0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
d3d0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
d3e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
d3f0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
d400: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
d410: 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
d420: 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
d430: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
d440: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e     sqlite3Strlen
d470: 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b  30(p->zName),p);
d480: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b  .    if( pOld ){
d490: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d4a0: 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61  ==pOld );  /* Ma
d4b0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
d4c0: 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73  ailed inside Has
d4d0: 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20  hInsert() */.   
d4e0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
d4f0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
d500: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
d510: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
d520: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  le = 0;.    db->
d530: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
d540: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
d550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d560: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
d570: 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
d580: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
d590: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
d5a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
d5b0: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
d5c0: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
d5d0: 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
d5e0: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
d5f0: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
d600: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
d610: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
d620: 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
d630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
d640: 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
d650: 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
d660: 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
d670: 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
d680: 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
d690: 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
d6a0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
d6b0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
d6c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d6d0: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
d6e0: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
d6f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
d700: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
d710: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
d720: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
d730: 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
d740: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
d750: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
d760: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
d770: 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
d780: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
d790: 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
d7a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
d7b0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
d7c0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
d7d0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
d7e0: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
d7f0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
d800: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
d810: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
d820: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
d830: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
d840: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
d850: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
d860: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
d870: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
d880: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
d890: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
d8a0: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
d8b0: 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  w */.  int noErr
d8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70            /* Sup
d8d0: 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73  press error mess
d8e0: 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72  ages if VIEW alr
d8f0: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
d900: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
d910: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
d920: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
d930: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
d940: 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
d950: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
d960: 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  iDb;.  sqlite3 *
d970: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d980: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
d990: 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71  nVar>0 ){.    sq
d9a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d9b0: 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72  arse, "parameter
d9c0: 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
d9d0: 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20  d in views");.  
d9e0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d9f0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
da00: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
da10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
da20: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
da30: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
da40: 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
da50: 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
da60: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
da70: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
da80: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
da90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
daa0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
dab0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
dac0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50   }.  sqlite3TwoP
dad0: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
dae0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
daf0: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d  &pName);.  iDb =
db00: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
db10: 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63  Index(db, p->pSc
db20: 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c  hema);.  if( sql
db30: 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
db40: 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
db50: 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20  "view", pName). 
db60: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 78     && sqlite3Fix
db70: 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53  Select(&sFix, pS
db80: 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20  elect).  ){.    
db90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
dba0: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
dbb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
dbc0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  }..  /* Make a c
dbd0: 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
dbe0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
dbf0: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
dc00: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
dc10: 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
dc20: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
dc30: 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
dc40: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
dc50: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
dc60: 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
dc70: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
dc80: 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
dc90: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
dca0: 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
dcb0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
dcc0: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
dcd0: 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
dce0: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
dcf0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
dd00: 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50  db, pSelect, EXP
dd10: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
dd20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
dd30: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
dd40: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
dd50: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
dd60: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
dd70: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
dd80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
dd90: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
dda0: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
ddb0: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
ddc0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
ddd0: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
dde0: 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
ddf0: 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
de00: 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
de10: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
de20: 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41  stToken;.  if( A
de30: 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21  LWAYS(sEnd.z[0]!
de40: 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  =0) && sEnd.z[0]
de50: 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
de60: 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
de70: 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
de80: 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e  .  n = (int)(sEn
de90: 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29  d.z - pBegin->z)
dea0: 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
deb0: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c 57 41  z;.  while( ALWA
dec0: 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c 69 74  YS(n>0) && sqlit
ded0: 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
dee0: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
def0: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
df00: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
df10: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
df20: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
df30: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
df40: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
df50: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
df60: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
df70: 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  , 0, &sEnd, 0);.
df80: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
df90: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
dfa0: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
dfb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dfc0: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
dfd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
dfe0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
dff0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
e000: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
e010: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
e020: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
e030: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
e040: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
e050: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
e060: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
e070: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
e080: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
e090: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
e0a0: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
e0b0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
e0c0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
e0d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
e0e0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
e0f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
e100: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
e110: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
e120: 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
e130: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
e140: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
e150: 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
e160: 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
e170: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
e180: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
e190: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
e1a0: 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
e1b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
e1c0: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
e1d0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
e1e0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
e1f0: 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
e200: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
e210: 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
e220: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e230: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
e240: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e250: 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
e260: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ors */.  int (*x
e270: 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Auth)(void*,int,
e280: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
e290: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
e2a0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
e2b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
e2c0: 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
e2d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e2e0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73  UALTABLE.  if( s
e2f0: 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
e300: 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
e310: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
e320: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
e330: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
e340: 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
e350: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
e360: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e370: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
e380: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
e390: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
e3a0: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
e3b0: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
e3c0: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
e3d0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
e3e0: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
e3f0: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
e400: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
e410: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
e420: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
e430: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
e440: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
e450: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
e460: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
e470: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
e480: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
e490: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
e4a0: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
e4b0: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
e4c0: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
e4d0: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
e4e0: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
e4f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
e500: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
e510: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
e520: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
e530: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
e540: 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62  ly, the error ab
e550: 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ove is now caugh
e560: 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
e570: 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a  ing this point..
e580: 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c    ** But the fol
e590: 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73  lowing test is s
e5a0: 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61  till important a
e5b0: 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75  s it does come u
e5c0: 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f  p.  ** in the fo
e5d0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20  llowing:.  ** . 
e5e0: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
e5f0: 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29  ABLE main.ex1(a)
e600: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
e610: 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20  E TEMP VIEW ex1 
e620: 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
e630: 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53   ex1;.  **     S
e640: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d  ELECT * FROM tem
e650: 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66  p.ex1;.  */.  if
e660: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
e670: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e680: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e690: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
e6a0: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
e6b0: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
e6c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
e6d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
e6e0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
e6f0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
e700: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
e710: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
e720: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
e730: 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
e740: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
e750: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
e760: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
e770: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
e780: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
e790: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
e7a0: 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
e7b0: 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
e7c0: 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
e7d0: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
e7e0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
e7f0: 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
e800: 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
e810: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
e820: 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
e830: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
e840: 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
e850: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
e860: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
e870: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
e880: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e890: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
e8a0: 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
e8b0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
e8c0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
e8d0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
e8e0: 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c   ){.    u8 enabl
e8f0: 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d  eLookaside = db-
e900: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e910: 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61  led;.    n = pPa
e920: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
e930: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
e940: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
e950: 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
e960: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
e970: 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c   = -1;.    db->l
e980: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
e990: 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  d = 0;.#ifndef S
e9a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
e9b0: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75  RIZATION.    xAu
e9c0: 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a  th = db->xAuth;.
e9d0: 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
e9e0: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  0;.    pSelTab =
e9f0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
ea00: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
ea10: 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d  , pSel);.    db-
ea20: 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a  >xAuth = xAuth;.
ea30: 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61  #else.    pSelTa
ea40: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
ea50: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
ea60: 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64  rse, pSel);.#end
ea70: 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  if.    db->looka
ea80: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
ea90: 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b  enableLookaside;
eaa0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
eab0: 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
eac0: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
ead0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
eae0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
eaf0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
eb00: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
eb10: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
eb20: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
eb30: 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
eb40: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
eb50: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
eb60: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
eb70: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
eb80: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
eb90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
eba0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
ebb0: 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e  (db, 0, pTable->
ebc0: 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
ebd0: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
ebe0: 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55  a->flags |= DB_U
ebf0: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20  nresetViews;.   
ec00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
ec10: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
ec20: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
ec30: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
ec40: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
ec50: 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20  pSel);.  } else 
ec60: 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  {.    nErr++;.  
ec70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ec80: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
ec90: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
eca0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
ecb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ecc0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
ecd0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ece0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
ecf0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ed00: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
ed10: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
ed20: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
ed30: 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
ed40: 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
ed50: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
ed60: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
ed70: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
ed80: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
ed90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
eda0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
edb0: 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b  d(db, idx, 0) );
edc0: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
edd0: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
ede0: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
edf0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
ee00: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
ee10: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
ee20: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
ee30: 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
ee40: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
ee50: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
ee60: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
ee70: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
ee80: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
ee90: 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d  qliteDeleteColum
eea0: 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29  nNames(db, pTab)
eeb0: 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  ;.      pTab->aC
eec0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54  ol = 0;.      pT
eed0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
eee0: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
eef0: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
ef00: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
ef10: 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
ef20: 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
ef30: 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
ef40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ef50: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
ef60: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ef70: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
ef80: 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
ef90: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
efa0: 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
efb0: 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
efc0: 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
efd0: 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
efe0: 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
eff0: 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
f000: 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
f010: 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
f020: 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
f030: 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a  .** to iTo..**.*
f040: 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20  * Ticket #1728: 
f050: 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   The symbol tabl
f060: 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f  e might still co
f070: 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ntain informatio
f080: 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61  n.** on tables a
f090: 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68  nd/or indices th
f0a0: 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65  at are the proce
f0b0: 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65  ss of being dele
f0c0: 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61  ted..** If you a
f0d0: 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20  re unlucky, one 
f0e0: 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64  of those deleted
f0f0: 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c   indices or tabl
f100: 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65  es might.** have
f110: 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61   the same rootpa
f120: 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ge number as the
f130: 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69   real table or i
f140: 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20  ndex that is.** 
f150: 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f  being moved.  So
f160: 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20   we cannot stop 
f170: 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20  searching after 
f180: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
f190: 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20  .** because the 
f1a0: 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68  first match migh
f1b0: 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  t be for one of 
f1c0: 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  the deleted indi
f1d0: 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73  ces.** or tables
f1e0: 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62   and not the tab
f1f0: 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73  le/index that is
f200: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
f210: 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73  moved..** We mus
f220: 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69  t continue loopi
f230: 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62  ng until all tab
f240: 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
f250: 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65  with.** rootpage
f260: 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65  ==iFrom have bee
f270: 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68  n converted to h
f280: 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f  ave a rootpage o
f290: 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65  f iTo.** in orde
f2a0: 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20  r to be certain 
f2b0: 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20  that we got the 
f2c0: 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69  right one..*/.#i
f2d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f2e0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
f2f0: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
f300: 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a  eMoved(sqlite3 *
f310: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
f320: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
f330: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
f340: 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
f350: 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  sh;.  Db *pDb;..
f360: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f370: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
f380: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
f390: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
f3a0: 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d  [iDb];.  pHash =
f3b0: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
f3c0: 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
f3d0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
f3e0: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
f3f0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
f400: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
f410: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
f420: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
f430: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
f440: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
f450: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
f460: 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
f470: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
f480: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
f490: 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
f4a0: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
f4b0: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
f4c0: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
f4d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
f4e0: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
f4f0: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
f500: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
f510: 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
f520: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
f530: 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
f540: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
f550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
f560: 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
f570: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
f580: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
f590: 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
f5a0: 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
f5b0: 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
f5c0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f5d0: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
f5e0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
f5f0: 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
f600: 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
f610: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
f620: 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
f630: 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
f640: 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
f650: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
f660: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
f670: 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
f680: 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
f690: 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
f6a0: 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
f6b0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
f6c0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
f6d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
f6e0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
f6f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
f700: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
f710: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
f720: 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
f730: 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  1, iDb);.  sqlit
f740: 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
f750: 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
f760: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f770: 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
f780: 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20  oy stores an in 
f790: 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74  integer r1. If t
f7a0: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
f7b0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
f7c0: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
f7d0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
f7e0: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
f7f0: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
f800: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
f810: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
f820: 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
f830: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
f840: 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
f850: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
f860: 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51  "#NNN" in the SQ
f870: 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
f880: 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
f890: 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
f8a0: 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67  e.  ** is in reg
f8b0: 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20  ister NNN.  See 
f8c0: 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73  grammar rules as
f8d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
f8e0: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  e TK_REGISTER.  
f8f0: 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64  ** token for add
f900: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
f910: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ion..  */.  sqli
f920: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
f930: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50  Parse, .     "UP
f940: 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72  DATE %Q.%s SET r
f950: 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45  ootpage=%d WHERE
f960: 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67   #%d AND rootpag
f970: 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61  e=#%d",.     pPa
f980: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
f990: 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
f9a0: 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62  TABLE(iDb), iTab
f9b0: 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e  le, r1, r1);.#en
f9c0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  dif.  sqlite3Rel
f9d0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
f9e0: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
f9f0: 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64  * Write VDBE cod
fa00: 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65  e to erase table
fa10: 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73   pTab and all as
fa20: 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73  sociated indices
fa30: 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64   on disk..** Cod
fa40: 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
fa50: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
fa60: 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61  bles and interna
fa70: 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74  l schema definit
fa80: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20  ions.** in case 
fa90: 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f  a root-page belo
faa0: 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72  nging to another
fab0: 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
fac0: 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  by the btree lay
fad0: 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64  er.** is also ad
fae0: 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61  ded (this can ha
faf0: 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
fb00: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
fb10: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e)..*/.static vo
fb20: 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28  id destroyTable(
fb30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
fb40: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66  able *pTab){.#if
fb50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fb60: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64  AUTOVACUUM.  Ind
fb70: 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
fb80: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
fb90: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
fba0: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
fbb0: 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79  hema);.  destroy
fbc0: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
fbd0: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62   pTab->tnum, iDb
fbe0: 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  );.  for(pIdx=pT
fbf0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
fc00: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
fc10: 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  xt){.    destroy
fc20: 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
fc30: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
fc40: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f  );.  }.#else.  /
fc50: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
fc60: 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61  e may be auto-va
fc70: 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66  cuum capable (if
fc80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
fc90: 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20  OVACUUM.  ** is 
fca0: 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68  not defined), th
fcb0: 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  en it is importa
fcc0: 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65  nt to call OP_De
fcd0: 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a  stroy on the.  *
fce0: 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  * table and inde
fcf0: 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20  x root-pages in 
fd00: 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20  order, starting 
fd10: 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63  with the numeric
fd20: 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65  ally .  ** large
fd30: 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
fd40: 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e  ber. This guaran
fd50: 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f  tees that none o
fd60: 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73  f the root-pages
fd70: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74  .  ** to be dest
fd80: 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74  royed is relocat
fd90: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
fda0: 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65   OP_Destroy. i.e
fdb0: 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f  . if the.  ** fo
fdc0: 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64  llowing were cod
fdd0: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50  ed:.  **.  ** OP
fde0: 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a  _Destroy 4 0.  *
fdf0: 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65  * ....  ** OP_De
fe00: 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20  stroy 5 0.  **. 
fe10: 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67   ** and root pag
fe20: 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20  e 5 happened to 
fe30: 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  be the largest r
fe40: 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
fe50: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
fe60: 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20  base, then root 
fe70: 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20  page 5 would be 
fe80: 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20  moved to page 4 
fe90: 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50  by the .  ** "OP
fea0: 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70  _Destroy 4 0" op
feb0: 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71  code. The subseq
fec0: 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79  uent "OP_Destroy
fed0: 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a   5 0" would hit.
fee0: 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74    ** a free-list
fef0: 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e   page..  */.  in
ff00: 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74  t iTab = pTab->t
ff10: 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74  num;.  int iDest
ff20: 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68  royed = 0;..  wh
ff30: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e  ile( 1 ){.    In
ff40: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69  dex *pIdx;.    i
ff50: 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b  nt iLargest = 0;
ff60: 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72  ..    if( iDestr
ff70: 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c  oyed==0 || iTab<
ff80: 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20  iDestroyed ){.  
ff90: 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
ffa0: 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Tab;.    }.    f
ffb0: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
ffc0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
ffd0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
ffe0: 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20       int iIdx = 
fff0: 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pIdx->tnum;.    
10000 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
10010 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
10020 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
10030 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
10040 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
10050 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
10060 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
10070 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
10080 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
10090 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
100a0 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gest==0 ){.     
100b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c   return;.    }el
100c0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  se{.      int iD
100d0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
100e0 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
100f0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
10100 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ma);.      asser
10110 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
10120 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
10130 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f   );.      destro
10140 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
10150 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29  , iLargest, iDb)
10160 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79  ;.      iDestroy
10170 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
10180 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
10190 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
101a0 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65  entries from the
101b0 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61   sqlite_statN ta
101c0 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28  bles (for N in (
101d0 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72  1,2,3)).** after
101e0 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72   a DROP INDEX or
101f0 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d   DROP TABLE comm
10200 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  and..*/.static v
10210 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
10220 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61  StatTables(.  Pa
10230 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10240 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10250 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10260 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20   int iDb,       
10270 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
10280 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
10290 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
102a0 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69  zType,     /* "i
102b0 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a  dx" or "tbl" */.
102c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
102d0 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame      /* Name
102e0 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62   of index or tab
102f0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  le */.){.  int i
10300 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10310 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65  zDbName = pParse
10320 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
10330 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Name;.  for(i=1;
10340 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=4; i++){.   
10350 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a   char zTab[24];.
10360 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10370 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62  intf(sizeof(zTab
10380 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73  ),zTab,"sqlite_s
10390 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69  tat%d",i);.    i
103a0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
103b0 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
103c0 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29  zTab, zDbName) )
103d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
103e0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
103f0 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
10400 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
10410 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
10420 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
10430 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a  b, zType, zName.
10440 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
10450 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
10460 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f  rate code to dro
10470 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  p a table..*/.vo
10480 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72  id sqlite3CodeDr
10490 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
104a0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
104b0 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  ab, int iDb, int
104c0 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65   isView){.  Vdbe
104d0 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
104e0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
104f0 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
10500 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20  gger;.  Db *pDb 
10510 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
10520 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
10530 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10540 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
10550 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
10560 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
10570 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
10580 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10590 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
105a0 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
105b0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
105c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
105d0 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
105e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
105f0 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
10600 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
10610 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
10620 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
10630 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  .  ** is generat
10640 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
10650 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
10660 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
10670 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
10680 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
10690 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67  ed..  */.  pTrig
106a0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
106b0 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ggerList(pParse,
106c0 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   pTab);.  while(
106d0 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
106e0 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
106f0 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
10700 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
10710 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
10720 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
10730 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
10740 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
10750 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
10760 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
10770 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
10780 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
10790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
107a0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
107b0 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  NT.  /* Remove a
107c0 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
107d0 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
107e0 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
107f0 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
10800 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
10810 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f  pped. This is do
10820 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61  ne before the ta
10830 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20  ble is dropped. 
10840 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
10850 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
10860 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
10870 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
10880 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  to.  ** move as 
10890 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
108a0 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
108b0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
108c0 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  mode)..  */.  if
108d0 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
108e0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
108f0 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
10900 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10910 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c  arse,.      "DEL
10920 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ETE FROM %Q.sqli
10930 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
10940 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
10950 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54    pDb->zName, pT
10960 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ab->zName.    );
10970 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
10980 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
10990 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61  E_MASTER table a
109a0 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
109b0 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
109c0 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  he.  ** table. T
109d0 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
109e0 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
109f0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
10a00 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20  nd deletes.  ** 
10a10 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
10a20 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
10a30 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
10a40 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
10a50 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e  ng.  ** dropped.
10a60 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61   Triggers are ha
10a70 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
10a80 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67   because a trigg
10a90 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63  er can be.  ** c
10aa0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
10ab0 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
10ac0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
10ad0 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
10ae0 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ** database..  *
10af0 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
10b00 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
10b10 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
10b20 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74  OM %Q.%s WHERE t
10b30 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74  bl_name=%Q and t
10b40 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c  ype!='trigger'",
10b50 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
10b60 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
10b70 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
10b80 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65  e);.  if( !isVie
10b90 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
10ba0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73  pTab) ){.    des
10bb0 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
10bc0 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20  , pTab);.  }..  
10bd0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
10be0 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
10bf0 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
10c00 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
10c10 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
10c20 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a  ma cookie..  */.
10c30 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
10c40 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
10c50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
10c60 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69  , OP_VDestroy, i
10c70 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
10c80 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  zName, 0);.  }. 
10c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10ca0 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p4(v, OP_DropTab
10cb0 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  le, iDb, 0, 0, p
10cc0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
10cd0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
10ce0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
10cf0 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77  b);.  sqliteView
10d00 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
10d10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
10d20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10d30 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
10d40 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
10d50 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
10d60 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
10d70 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
10d80 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
10d90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
10da0 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
10db0 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
10dc0 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
10dd0 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
10de0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
10df0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
10e00 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
10e10 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
10e20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
10e30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
10e40 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
10e50 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
10e60 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
10e70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
10e80 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
10e90 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
10ea0 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b  b->suppressErr++
10eb0 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
10ec0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
10ed0 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77  m(pParse, isView
10ee0 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  , &pName->a[0]);
10ef0 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
10f00 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d  b->suppressErr--
10f10 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
10f20 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72   ){.    if( noEr
10f30 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  r ) sqlite3CodeV
10f40 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
10f50 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
10f60 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
10f70 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
10f80 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
10f90 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
10fa0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
10fb0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
10fc0 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
10fd0 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
10fe0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62  );..  /* If pTab
10ff0 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
11000 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65  ble, call ViewGe
11010 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74  tColumnNames() t
11020 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74  o ensure.  ** it
11030 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
11040 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
11050 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 73  rtual(pTab) && s
11060 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
11070 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
11080 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f   pTab) ){.    go
11090 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
110a0 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  le;.  }.#ifndef 
110b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
110c0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
110d0 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
110e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
110f0 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
11100 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
11110 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
11120 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
11130 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11140 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
11150 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11160 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
11170 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
11180 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
11190 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
111a0 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
111b0 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
111c0 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
111d0 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
111e0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
111f0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
11200 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
11210 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
11220 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
11230 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
11240 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11250 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
11260 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
11270 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
11280 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
11290 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
112a0 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
112b0 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
112c0 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64  (db, pTab)->pMod
112d0 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
112e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
112f0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
11300 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
11310 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
11320 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
11330 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
11340 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
11350 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
11360 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
11370 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
11380 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11390 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
113a0 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
113b0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
113c0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
113d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
113e0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
113f0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
11400 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
11410 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
11420 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11430 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
11440 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
11450 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
11460 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
11470 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
11480 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33   .    && sqlite3
11490 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
114a0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74  Name, "sqlite_st
114b0 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20  at", 11)!=0 ){. 
114c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
114d0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
114e0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
114f0 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
11500 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
11510 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
11520 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
11530 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
11540 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
11550 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
11560 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
11570 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
11580 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
11590 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
115a0 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
115b0 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
115c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
115d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
115e0 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
115f0 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
11600 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
11610 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
11620 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
11630 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
11640 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
11650 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11660 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
11670 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
11680 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
11690 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
116a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
116b0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
116c0 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
116d0 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
116e0 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
116f0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
11700 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
11710 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
11720 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11730 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
11740 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
11750 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
11760 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
11770 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
11780 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
11790 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62  iDb, "tbl", pTab
117a0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
117b0 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65  lite3FkDropTable
117c0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20  (pParse, pName, 
117d0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
117e0 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
117f0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44  pParse, pTab, iD
11800 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a  b, isView);.  }.
11810 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
11820 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
11830 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
11840 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
11850 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
11860 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
11870 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
11880 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
11890 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
118a0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
118b0 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
118c0 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
118d0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
118e0 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
118f0 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
11900 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
11910 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
11920 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
11930 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
11940 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
11950 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
11960 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
11970 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69  ed to.  pToCol i
11980 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  s a list of tabl
11990 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a  es in the other.
119a0 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61  ** pTo table tha
119b0 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
119c0 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c  y points to.  fl
119d0 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
119e0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
119f0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
11a00 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
11a10 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
11a20 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
11a30 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
11a40 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
11a50 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
11a60 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
11a70 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
11a80 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
11a90 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
11aa0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
11ab0 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
11ac0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
11ad0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  d..**.** The for
11ae0 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
11af0 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
11b00 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
11b10 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
11b20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
11b30 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
11b40 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
11b50 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
11b60 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
11b70 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
11b80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11b90 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
11ba0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
11bb0 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
11bc0 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
11bd0 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
11be0 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
11bf0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
11c00 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
11c10 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
11c20 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
11c30 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
11c40 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
11c50 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
11c60 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
11c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
11c80 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
11c90 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
11ca0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
11cb0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
11cc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11cd0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
11ce0 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
11cf0 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54  ;.  FKey *pNextT
11d00 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  o;.  Table *p = 
11d10 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
11d20 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
11d30 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
11d40 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
11d50 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
11d60 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
11d70 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
11d80 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
11d90 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
11da0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
11db0 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
11dc0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69  .    if( NEVER(i
11dd0 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b  Col<0) ) goto fk
11de0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
11df0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
11e00 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
11e10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11e20 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
11e30 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
11e40 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
11e50 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
11e60 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
11e70 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
11e80 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
11e90 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
11ea0 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11eb0 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
11ec0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
11ed0 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
11ee0 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
11ef0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
11f00 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11f10 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
11f20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11f30 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
11f40 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
11f50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
11f60 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
11f70 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
11f80 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
11f90 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
11fa0 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
11fb0 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
11fc0 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
11fd0 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
11fe0 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
11ff0 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
12000 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
12010 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
12020 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
12030 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
12040 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
12050 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12060 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
12070 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
12080 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
12090 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
120a0 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
120b0 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
120c0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
120d0 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
120e0 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
120f0 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
12100 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
12110 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
12120 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
12130 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
12140 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
12150 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
12160 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
12170 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
12180 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
12190 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
121a0 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
121b0 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
121c0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
121d0 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
121e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
121f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
12200 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
12210 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
12220 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
12230 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
12240 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
12250 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
12260 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
12270 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
12280 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
12290 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
122a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
122b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
122c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
122d0 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
122e0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
122f0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
12300 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
12310 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
12320 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
12330 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
12340 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
12350 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
12360 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
12370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12380 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
12390 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
123a0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
123b0 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
123c0 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
123d0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
123e0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
123f0 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
12400 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
12410 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
12420 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
12430 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
12440 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
12450 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
12460 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
12470 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20  y->aAction[0] = 
12480 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
12490 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  f);            /
124a0 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69  * ON DELETE acti
124b0 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61  on */.  pFKey->a
124c0 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29  Action[1] = (u8)
124d0 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26  ((flags >> 8 ) &
124e0 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e   0xff);    /* ON
124f0 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a   UPDATE action *
12500 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
12510 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
12520 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53  eld(db, 0, p->pS
12530 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78  chema) );.  pNex
12540 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71  tTo = (FKey *)sq
12550 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
12560 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65  &p->pSchema->fke
12570 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46  yHash, .      pF
12580 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74 65  Key->zTo, sqlite
12590 33 53 74 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d  3Strlen30(pFKey-
125a0 3e 7a 54 6f 29 2c 20 28 76 6f 69 64 20 2a 29 70  >zTo), (void *)p
125b0 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20  FKey.  );.  if( 
125c0 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29  pNextTo==pFKey )
125d0 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
125e0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
125f0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
12600 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29  .  if( pNextTo )
12610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
12620 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d  extTo->pPrevTo==
12630 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 );.    pFKey->
12640 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54  pNextTo = pNextT
12650 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e  o;.    pNextTo->
12660 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b  pPrevTo = pFKey;
12670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
12680 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
12690 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
126a0 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
126b0 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
126c0 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
126d0 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
126e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
126f0 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66  , pFKey);.#endif
12700 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
12710 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
12720 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74  _KEY) */.  sqlit
12730 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
12740 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a  (db, pFromCol);.
12750 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
12760 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43  tDelete(db, pToC
12770 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
12780 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12790 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
127a0 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
127b0 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
127c0 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
127d0 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
127e0 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
127f0 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
12800 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
12810 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
12820 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
12830 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
12840 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
12850 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
12860 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
12870 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
12880 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
12890 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
128a0 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
128b0 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
128c0 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
128d0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
128e0 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
128f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
12900 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
12910 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
12920 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
12930 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
12940 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
12950 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
12960 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
12970 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65  ;.  assert( isDe
12980 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44  ferred==0 || isD
12990 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a  eferred==1 ); /*
129a0 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39   EV: R-30323-219
129b0 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69  17 */.  pFKey->i
129c0 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29  sDeferred = (u8)
129d0 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
129e0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
129f0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
12a00 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
12a10 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
12a20 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
12a30 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
12a40 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
12a50 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
12a60 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
12a70 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
12a80 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
12a90 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
12aa0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
12ab0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
12ac0 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
12ad0 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
12ae0 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
12af0 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69  eated.  The regi
12b00 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62  ster specified b
12b10 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
12b20 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
12b30 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
12b40 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
12b50 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
12b60 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
12b70 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
12b80 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
12b90 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
12ba0 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
12bb0 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
12bc0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
12bd0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
12be0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
12bf0 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
12c00 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
12c10 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
12c20 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
12c30 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
12c40 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
12c50 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
12c60 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
12c70 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
12c80 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
12c90 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
12ca0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
12cb0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
12cc0 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
12cd0 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
12ce0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
12cf0 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
12d00 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
12d10 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72  */.  int iSorter
12d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12d30 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
12d40 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74  ened by OpenSort
12d50 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a  er (if in use) *
12d60 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
12d90 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
12da0 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20    int addr2;    
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a   /* Address to j
12dd0 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20  ump to for next 
12de0 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  iteration */.  i
12df0 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e10 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
12e20 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  dex */.  int iPa
12e30 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20  rtIdxLabel;     
12e40 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
12e50 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f  to this label to
12e60 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20   skip a row */. 
12e70 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
12ea0 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
12eb0 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
12ec0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20  KeyInfo *pKey;  
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ee0 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e  * KeyInfo for in
12ef0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  dex */.  int reg
12f00 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
12f10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
12f20 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
12f30 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63  mblied index rec
12f40 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
12f50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
12f60 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
12f70 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12f80 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
12f90 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
12fa0 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
12fb0 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
12fc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12fd0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
12fe0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
12ff0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
13000 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
13010 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
13020 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
13030 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
13040 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
13050 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
13060 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
13070 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
13080 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
13090 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
130a0 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
130b0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
130c0 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
130d0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
130e0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
130f0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
13100 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
13110 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
13120 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
13130 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
13140 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
13150 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
13160 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13170 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
13180 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d   tnum, iDb);.  }
13190 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
131a0 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
131b0 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
131c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
131d0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p4(v, OP_OpenWri
131e0 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20  te, iIdx, tnum, 
131f0 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iDb, .          
13200 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20            (char 
13210 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
13220 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73  FO_HANDOFF);.  s
13230 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13240 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c  P5(v, OPFLAG_BUL
13250 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61  KCSR|((memRootPa
13260 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32  ge>=0)?OPFLAG_P2
13270 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 2f 2a  ISREG:0));..  /*
13280 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
13290 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
132a0 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
132b0 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
132c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
132d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
132e0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
132f0 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 30  n, iSorter, 0, 0
13300 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50  , (char*)pKey, P
13310 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f  4_KEYINFO);..  /
13320 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65  * Open the table
13330 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  . Loop through a
13340 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
13350 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20  able, inserting 
13360 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72  index.  ** recor
13370 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ds into the sort
13380 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  er. */.  sqlite3
13390 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
133a0 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
133b0 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
133c0 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
133d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
133e0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
133f0 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64   0);.  regRecord
13400 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
13410 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20  pReg(pParse);.. 
13420 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
13430 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
13440 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72   pIndex, iTab, r
13450 65 67 52 65 63 6f 72 64 2c 20 31 2c 20 26 69 50  egRecord, 1, &iP
13460 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
13470 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13480 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e  2(v, OP_SorterIn
13490 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72  sert, iSorter, r
134a0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
134b0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
134c0 61 62 65 6c 28 76 2c 20 69 50 61 72 74 49 64 78  abel(v, iPartIdx
134d0 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
134e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
134f0 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
13500 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
13510 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13520 20 61 64 64 72 31 29 3b 0a 20 20 61 64 64 72 31   addr1);.  addr1
13530 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13540 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
13550 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
13560 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  0);.  if( pIndex
13570 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
13580 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32  ne ){.    int j2
13590 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
135a0 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33  rrentAddr(v) + 3
135b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
135c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
135d0 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20  to, 0, j2);.    
135e0 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
135f0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13610 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
13620 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
13630 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
13640 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  cord);.    sqlit
13650 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
13660 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
13670 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
13680 45 2c 0a 20 20 20 20 20 20 20 20 4f 45 5f 41 62  E,.        OE_Ab
13690 6f 72 74 2c 20 22 69 6e 64 65 78 65 64 20 63 6f  ort, "indexed co
136a0 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
136b0 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43  ique", P4_STATIC
136c0 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
136d0 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
136e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
136f0 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  ddr(v);.  }.  sq
13700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13710 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
13720 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65  , iSorter, regRe
13730 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
13740 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13750 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78  _IdxInsert, iIdx
13760 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b  , regRecord, 1);
13770 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
13780 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
13790 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
137a0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
137b0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
137c0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
137d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
137e0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
137f0 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72  t, iSorter, addr
13800 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
13810 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
13820 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  r1);..  sqlite3V
13830 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13840 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
13850 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13860 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
13870 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
13880 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
13890 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b  Close, iSorter);
138a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
138b0 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
138c0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
138d0 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
138e0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
138f0 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
13900 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
13910 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
13920 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
13930 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
13940 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
13950 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
13960 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
13970 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
13980 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
13990 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
139a0 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
139b0 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
139c0 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
139d0 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
139e0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
139f0 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
13a00 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
13a10 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
13a20 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
13a30 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
13a40 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
13a50 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
13a60 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
13a70 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
13a80 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
13a90 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
13aa0 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
13ab0 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
13ac0 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
13ad0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
13ae0 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
13af0 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
13b00 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
13b10 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  truction.  .**.*
13b20 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  * If the index i
13b30 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73  s created succes
13b40 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61  sfully, return a
13b50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
13b60 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72  new Index.** str
13b70 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20  ucture. This is 
13b80 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41  used by sqlite3A
13b90 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74  ddPrimaryKey() t
13ba0 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78  o mark the index
13bb0 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
13bc0 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49  s primary key (I
13bd0 6e 64 65 78 2e 61 75 74 6f 49 6e 64 65 78 3d 3d  ndex.autoIndex==
13be0 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  2)..*/.Index *sq
13bf0 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
13c00 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13c10 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
13c20 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
13c30 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
13c40 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
13c50 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
13c60 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
13c70 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
13c80 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
13c90 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
13ca0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
13cb0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
13cc0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
13cd0 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
13ce0 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
13cf0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
13d00 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
13d10 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
13d20 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
13d30 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
13d40 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
13d50 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
13d60 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
13d70 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
13d80 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
13d90 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
13da0 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
13db0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
13dc0 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
13dd0 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65    Expr *pPIWhere
13de0 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  ,    /* WHERE cl
13df0 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c  ause for partial
13e00 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
13e10 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
13e20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
13e30 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
13e40 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
13e50 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
13e60 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st     /* Omit e
13e70 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
13e80 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
13e90 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74  ){.  Index *pRet
13ea0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69   = 0;     /* Poi
13eb0 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  nter to return *
13ec0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
13ed0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
13ee0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
13ef0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
13f00 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
13f10 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
13f20 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
13f30 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
13f40 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
13f50 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
13f60 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
13f70 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
13f80 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
13f90 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
13fa0 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20  Token nullId;   
13fb0 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b       /* Fake tok
13fc0 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
13fd0 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
13fe0 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20  ixer sFix;      
13ff0 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
14000 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
14010 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
14020 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61   int sortOrderMa
14030 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f  sk;   /* 1 to ho
14040 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65  nor DESC in inde
14050 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e  x.  0 to ignore.
14060 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
14070 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14080 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
14090 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
140a0 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e  ecific table con
140b0 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
140c0 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  xed database */.
140d0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
140e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
140f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14100 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
14110 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
14120 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *pName = 0;    
14130 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
14140 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
14150 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20   to create */.  
14160 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
14170 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b  item *pListItem;
14180 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
14190 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20  over pList */.  
141a0 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20  int nCol;.  int 
141b0 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68  nExtra = 0;.  ch
141c0 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 61  ar *zExtra;..  a
141d0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
141e0 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  Err==0 );      /
141f0 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
14200 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
14210 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
14220 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e  llocFailed || IN
14230 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
14240 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
14250 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
14260 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
14270 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
14280 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
14290 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
142a0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
142b0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
142c0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
142d0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
142e0 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
142f0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
14300 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
14310 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
14320 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
14330 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
14340 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
14350 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
14360 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
14370 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
14380 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
14390 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
143a0 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
143b0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
143c0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
143d0 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
143e0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
143f0 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
14400 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
14410 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
14420 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
14430 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14440 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
14450 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
14460 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
14470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
14480 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
14490 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
144a0 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
144b0 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
144c0 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
144d0 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
144e0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
144f0 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
14500 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
14510 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
14520 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
14530 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
14540 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
14550 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
14560 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
14570 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
14580 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
14590 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
145a0 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
145b0 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
145c0 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
145d0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
145e0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
145f0 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  f..    if( sqlit
14600 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
14610 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
14620 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26  ndex", pName) &&
14630 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14640 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
14650 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20  , pTblName).    
14660 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
14670 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
14680 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
14690 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
146a0 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
146b0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
146c0 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
146d0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
146e0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
146f0 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
14700 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
14710 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26  tem(pParse, 0, &
14720 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  pTblName->a[0]);
14730 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
14740 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
14750 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20   || pTab==0 );. 
14760 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
14770 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14780 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
14790 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61   iDb==1 && db->a
147a0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21  Db[iDb].pSchema!
147b0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
147c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
147d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
147e0 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e  .           "can
147f0 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d  not create a TEM
14800 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54  P index on non-T
14810 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22  EMP table \"%s\"
14820 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
14830 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14840 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14850 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
14870 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
14880 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
14890 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  art==0 );.    pT
148a0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
148b0 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
148c0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
148d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
148e0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
148f0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
14900 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
14910 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
14920 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
14930 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
14940 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
14950 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
14960 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
14970 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
14980 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
14990 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
149a0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
149b0 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c  &pTab->zName[7],
149c0 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d  "altertab_",9)!=
149d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
149e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
149f0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
14a00 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
14a10 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
14a20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14a30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
14a40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14a50 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
14a60 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
14a70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14a80 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
14a90 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
14aa0 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
14ab0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14ac0 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  x;.  }.#endif.#i
14ad0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ae0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
14af0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14b00 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
14b10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14b20 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62  se, "virtual tab
14b30 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  les may not be i
14b40 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
14b50 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
14b60 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
14b70 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
14b80 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
14b90 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
14ba0 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
14bb0 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
14bc0 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
14bd0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
14be0 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
14bf0 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
14c00 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
14c10 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
14c20 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
14c30 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
14c40 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
14c50 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
14c60 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
14c70 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
14c80 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
14c90 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
14ca0 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
14cb0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
14cc0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
14cd0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
14ce0 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
14cf0 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
14d00 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
14d10 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
14d20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
14d30 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
14d40 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
14d50 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
14d60 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
14d70 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
14d80 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
14d90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
14da0 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
14db0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
14dc0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
14dd0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
14de0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
14df0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14e00 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
14e10 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  >z!=0 );.    if(
14e20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
14e30 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
14e40 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
14e50 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
14e60 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
14e70 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
14e80 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
14e90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
14ea0 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
14eb0 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
14ec0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14ed0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14ee0 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
14ef0 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
14f00 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
14f10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
14f20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
14f30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14f40 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
14f50 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
14f60 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20   pDb->zName)!=0 
14f70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66  ){.      if( !if
14f80 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20  NotExist ){.    
14f90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14fa0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
14fb0 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
14fc0 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
14fd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14fe0 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
14ff0 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
15000 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
15010 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
15020 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
15030 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
15040 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15050 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
15060 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
15070 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
15080 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
15090 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
150a0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
150b0 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
150c0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
150d0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
150e0 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
150f0 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e  x_%s_%d", pTab->
15100 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69  zName, n);.    i
15110 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
15120 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
15130 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
15140 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
15150 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
15160 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
15170 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
15180 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15190 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
151a0 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
151b0 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a  ar *zDb = pDb->z
151c0 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
151d0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
151e0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
151f0 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
15200 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
15210 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
15220 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
15240 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
15250 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
15260 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
15270 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
15280 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
15290 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
152a0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
152b0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
152c0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
152d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
152e0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
152f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
15300 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
15310 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
15320 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
15330 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
15340 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
15350 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
15360 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
15370 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
15380 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
15390 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
153a0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
153b0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
153c0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
153d0 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a   ){.    nullId.z
153e0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54   = pTab->aCol[pT
153f0 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d  ab->nCol-1].zNam
15400 65 3b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20  e;.    nullId.n 
15410 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15420 30 28 28 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e  0((char*)nullId.
15430 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  z);.    pList = 
15440 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
15450 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
15460 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69   0);.    if( pLi
15470 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
15480 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
15490 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
154a0 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
154b0 65 2c 20 70 4c 69 73 74 2c 20 26 6e 75 6c 6c 49  e, pList, &nullI
154c0 64 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74  d, 0);.    pList
154d0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
154e0 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72   = (u8)sortOrder
154f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
15500 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
15510 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
15520 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
15530 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
15540 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
15550 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
15560 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
15570 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
15580 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
15590 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
155a0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
155b0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  pr;.    if( pExp
155c0 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
155d0 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
155e0 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20  _COLLATE );.    
155f0 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
15600 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15610 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
15620 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
15630 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
15640 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
15650 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
15660 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
15670 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
15680 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e    nCol = pList->
15690 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20  nExpr;.  pIndex 
156a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
156b0 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20  cZero(db, .     
156c0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49   ROUND8(sizeof(I
156d0 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20 20  ndex)) +        
156e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
156f0 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
15700 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
15710 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b  (tRowcnt)*(nCol+
15720 31 29 29 20 2b 20 20 20 2f 2a 20 49 6e 64 65 78  1)) +   /* Index
15730 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20  .aiRowEst   */. 
15740 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72       sizeof(char
15750 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20   *)*nCol +      
15760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15770 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
15780 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e  .      sizeof(in
15790 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  t)*nCol +       
157a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
157b0 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
157c0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
157d0 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  u8)*nCol +      
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
157f0 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
15800 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65  r */.      nName
15810 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   + 1 +          
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20  /* Index.zName  
15840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78      */.      nEx
15850 74 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20  tra             
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
15880 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f  equence names */
15890 0a 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  .  );.  if( db->
158a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
158b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
158c0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
158d0 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
158e0 2a 29 70 49 6e 64 65 78 3b 0a 20 20 70 49 6e 64  *)pIndex;.  pInd
158f0 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
15900 74 52 6f 77 63 6e 74 2a 29 26 7a 45 78 74 72 61  tRowcnt*)&zExtra
15910 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49  [ROUND8(sizeof(I
15920 6e 64 65 78 29 29 5d 3b 0a 20 20 70 49 6e 64 65  ndex))];.  pInde
15930 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61  x->azColl = (cha
15940 72 2a 2a 29 0a 20 20 20 20 20 28 28 63 68 61 72  r**).     ((char
15950 2a 29 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45  *)pIndex->aiRowE
15960 73 74 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  st + ROUND8(size
15970 6f 66 28 74 52 6f 77 63 6e 74 29 2a 6e 43 6f 6c  of(tRowcnt)*nCol
15980 2b 31 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +1));.  assert( 
15990 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
159a0 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52  MENT(pIndex->aiR
159b0 6f 77 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65  owEst) );.  asse
159c0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
159d0 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
159e0 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49  >azColl) );.  pI
159f0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
15a00 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78   (int *)(&pIndex
15a10 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  ->azColl[nCol]);
15a20 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  .  pIndex->aSort
15a30 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26  Order = (u8 *)(&
15a40 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
15a50 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65  [nCol]);.  pInde
15a60 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72  x->zName = (char
15a70 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f   *)(&pIndex->aSo
15a80 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a  rtOrder[nCol]);.
15a90 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72    zExtra = (char
15aa0 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61   *)(&pIndex->zNa
15ab0 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20  me[nName+1]);.  
15ac0 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a  memcpy(pIndex->z
15ad0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
15ae0 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d  me+1);.  pIndex-
15af0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a  >pTable = pTab;.
15b00 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
15b10 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
15b20 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
15b30 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
15b40 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69  r;.  pIndex->uni
15b50 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  qNotNull = onErr
15b60 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  or==OE_Abort;.  
15b70 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
15b80 78 20 3d 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d  x = (u8)(pName==
15b90 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  0);.  pIndex->pS
15ba0 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
15bb0 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
15bc0 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a  if( pPIWhere ){.
15bd0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
15be0 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
15bf0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43  pParse, pTab, NC
15c00 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65  _PartIdx, pPIWhe
15c10 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64  re, 0);.    pInd
15c20 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  ex->pPartIdxWher
15c30 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20  e = pPIWhere;.  
15c40 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a    pPIWhere = 0;.
15c50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
15c60 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
15c70 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
15c80 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
15c90 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
15ca0 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
15cb0 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
15cc0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
15cd0 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
15ce0 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
15cf0 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
15d00 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
15d10 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
15d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
15d30 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
15d40 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
15d50 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63   */.  }..  /* Sc
15d60 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
15d70 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
15d80 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
15d90 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
15da0 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
15db0 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
15dc0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
15dd0 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
15de0 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
15df0 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
15e00 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  nd..  **.  ** TO
15e10 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20  DO:  Add a test 
15e20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
15e30 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  t the same colum
15e40 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20  n is not named. 
15e50 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   ** more than on
15e60 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ce within the sa
15e70 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  me index.  Only 
15e80 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  the first instan
15e90 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63  ce of.  ** the c
15ea0 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20  olumn will ever 
15eb0 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  be used by the o
15ec0 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20  ptimizer.  Note 
15ed0 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20  that using the. 
15ee0 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20   ** same column 
15ef0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63  more than once c
15f00 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f  annot be an erro
15f10 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  r because that w
15f20 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b  ould .  ** break
15f30 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
15f40 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65  tibility - it ne
15f50 65 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e  eds to be a warn
15f60 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
15f70 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70  i=0, pListItem=p
15f80 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
15f90 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c  ->nExpr; i++, pL
15fa0 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
15fb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
15fc0 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d  Name = pListItem
15fd0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  ->zName;.    Col
15fe0 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
15ff0 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
16000 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68  ortOrder;.    ch
16010 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16030 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
16040 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  ce name */..    
16050 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c  for(j=0, pTabCol
16060 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
16070 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
16080 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
16090 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
160a0 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70  ICmp(zColName, p
160b0 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d  TabCol->zName)==
160c0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
160d0 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62  .    if( j>=pTab
160e0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
160f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16100 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
16110 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  s has no column 
16120 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20  named %s",.     
16130 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
16140 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zColName);.     
16150 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
16160 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
16170 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
16180 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
16190 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
161a0 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69  mn[i] = j;.    i
161b0 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  f( pListItem->pE
161c0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  xpr ){.      int
161d0 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61 73   nColl;.      as
161e0 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d  sert( pListItem-
161f0 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pExpr->op==TK_C
16200 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
16210 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
16220 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  m->pExpr->u.zTok
16230 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  en;.      nColl 
16240 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
16250 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
16260 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
16270 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
16280 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
16290 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
162a0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
162b0 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
162c0 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
162d0 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
162e0 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oll;.    }else{.
162f0 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
16300 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
16310 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43  l;.      if( !zC
16320 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42  oll ) zColl = "B
16330 49 4e 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20 20  INARY";.    }.  
16340 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
16350 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
16360 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
16370 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
16380 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
16390 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
163a0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
163b0 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
163c0 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
163d0 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
163e0 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  tItem->sortOrder
163f0 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
16400 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
16410 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75  ortOrder[i] = (u
16420 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  8)requestedSortO
16430 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 70 54  rder;.    if( pT
16440 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  ab->aCol[j].notN
16450 75 6c 6c 3d 3d 30 20 29 20 70 49 6e 64 65 78 2d  ull==0 ) pIndex-
16460 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30  >uniqNotNull = 0
16470 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
16480 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
16490 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
164a0 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
164b0 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
164c0 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
164d0 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
164e0 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
164f0 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
16500 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
16510 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
16520 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
16530 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
16540 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
16550 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
16560 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
16570 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
16580 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
16590 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
165a0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
165b0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
165c0 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
165d0 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
165e0 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
165f0 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
16600 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
16610 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
16620 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
16630 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
16640 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
16650 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
16660 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
16670 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
16680 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
16690 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
166a0 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
166b0 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
166c0 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
166d0 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
166e0 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
166f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77      **.    ** Tw
16700 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
16710 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
16720 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  nts are consider
16730 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  ed equivalent.  
16740 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73    ** (and thus s
16750 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73  uppressing the s
16760 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20  econd one) even 
16770 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66  if they have dif
16780 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f  ferent.    ** so
16790 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a  rt orders..    *
167a0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
167b0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
167c0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
167d0 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f  ces or if the co
167e0 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20  lumns of.    ** 
167f0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  the constraint o
16800 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e  ccur in differen
16810 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74  t orders, then t
16820 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  he constraints a
16830 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  re.    ** consid
16840 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e  ered distinct an
16850 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e  d both result in
16860 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
16870 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
16880 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
16890 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
168a0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
168b0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
168c0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
168d0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
168e0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
168f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16900 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
16910 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x );.      asser
16920 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
16930 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
16940 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
16950 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d  nColumn!=pIndex-
16960 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >nColumn ) conti
16970 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
16980 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; k<pIdx->nCol
16990 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  umn; k++){.     
169a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
169b0 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
169c0 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
169d0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
169e0 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
169f0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
16a00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
16a10 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
16a20 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
16a30 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
16a40 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
16a50 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74   z1!=z2 && sqlit
16a60 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
16a70 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
16a80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
16a90 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
16aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
16ab0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
16ac0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
16ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
16ae0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
16af0 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
16b00 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
16b10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
16b20 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
16b30 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
16b40 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
16b50 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
16b60 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
16b70 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
16b80 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
16b90 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
16ba0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
16bb0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
16bc0 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
16bd0 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
16be0 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
16bf0 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
16c00 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
16c10 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
16c20 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
16c30 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
16c40 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
16c50 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
16c60 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
16c70 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
16c80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
16c90 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
16ca0 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
16cb0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
16cc0 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
16cd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16ce0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16cf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16d00 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
16d10 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
16d20 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
16d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
16d40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
16d50 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
16d60 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
16d70 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
16d80 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
16d90 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
16da0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
16db0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
16dc0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
16dd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16de0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
16df0 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
16e00 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
16e10 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
16e20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
16e30 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
16e40 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
16e50 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
16e60 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
16e70 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
16e80 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
16e90 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
16ea0 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
16eb0 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
16ec0 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
16ed0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
16ee0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
16f00 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69  dex->zName, sqli
16f10 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64  te3Strlen30(pInd
16f20 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  ex->zName),.    
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20        pIndex);. 
16f50 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
16f60 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
16f70 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
16f80 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
16f90 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  ed */.      db->
16fa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
16fb0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
16fc0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
16fd0 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
16fe0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
16ff0 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
17000 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
17010 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
17020 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
17030 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
17040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17050 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
17060 69 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65  is 0 then create
17070 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69   the index on di
17080 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69  sk.  This.  ** i
17090 6e 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20  nvolves writing 
170a0 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  the index into t
170b0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
170c0 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  and filling in t
170d0 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  he.  ** index wi
170e0 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
170f0 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20  able contents.. 
17100 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d   **.  ** The db-
17110 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20  >init.busy is 0 
17120 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69  when the user fi
17130 72 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45  rst enters a CRE
17140 41 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20  ATE INDEX .  ** 
17150 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e  command.  db->in
17160 69 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65  it.busy is 1 whe
17170 6e 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  n a database is 
17180 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a  opened and .  **
17190 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
171a0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61  atements are rea
171b0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73  d out of the mas
171c0 74 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20  ter table.  In. 
171d0 20 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63   ** the latter c
171e0 61 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c  ase the index al
171f0 72 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20  ready exists on 
17200 64 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77  disk, which is w
17210 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74  hy.  ** we don't
17220 20 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74   want to recreat
17230 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e it..  **.  ** 
17240 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
17250 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
17260 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
17270 61 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  as a primary key
17280 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
17290 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20  constraint of a 
172a0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
172b0 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74  tement.  Since t
172c0 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61  he table.  ** ha
172d0 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61  s just been crea
172e0 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ted, it contains
172f0 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65   no data and the
17300 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a   index initializ
17310 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20  ation.  ** step 
17320 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
17330 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
17340 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
17350 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
17360 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
17370 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
17380 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
17390 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
173a0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
173b0 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
173c0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
173d0 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a  _index;...    /*
173e0 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
173f0 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64  page for the ind
17400 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
17410 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
17420 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
17430 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
17440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17450 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
17460 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a  x, iDb, iMem);..
17470 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
17480 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
17490 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
174a0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
174b0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
174c0 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
174d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
174e0 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rt ){.      int 
174f0 6e 20 3d 20 28 70 50 61 72 73 65 2d 3e 73 4c 61  n = (pParse->sLa
17500 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d  stToken.z - pNam
17510 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e  e->z) + pParse->
17520 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20  sLastToken.n;.  
17530 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a      if( pName->z
17540 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d  [n-1]==';' ) n--
17550 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d  ;.      /* A nam
17560 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
17570 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
17580 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
17590 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
175a0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
175b0 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49  (db, "CREATE%s I
175c0 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20  NDEX %.*s",.    
175d0 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
175e0 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
175f0 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d  IQUE", n, pName-
17600 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >z);.    }else{.
17610 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f        /* An auto
17620 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61  matic index crea
17630 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59  ted by a PRIMARY
17640 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
17650 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
17660 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
17670 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
17680 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  ; */.      zStmt
17690 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
176a0 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79   /* Add an entry
176b0 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   in sqlite_maste
176c0 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78  r for this index
176d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
176e0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
176f0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
17700 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e  "INSERT INTO %Q.
17710 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78  %s VALUES('index
17720 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b  ',%Q,%Q,#%d,%Q);
17730 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
17740 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
17750 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
17760 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ,.        pIndex
17770 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
17780 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
17790 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20        iMem,.    
177a0 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b      zStmt.    );
177b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
177c0 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a  ee(db, zStmt);..
177d0 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
177e0 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
177f0 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
17800 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
17810 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a  OP_Expire.    **
17820 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
17830 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ll pre-compiled 
17840 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
17850 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  */.    if( pTblN
17860 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ame ){.      sql
17870 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
17880 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
17890 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  iMem);.      sql
178a0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
178b0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
178c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
178d0 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
178e0 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
178f0 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
17900 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20  (db, "name='%q' 
17910 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
17920 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
17930 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
17940 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17950 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20  P_Expire, 0);.  
17960 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
17970 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
17980 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
17990 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
179a0 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
179b0 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
179c0 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
179d0 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
179e0 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
179f0 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
17a00 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
17a10 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
17a20 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  rect constraint 
17a30 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65  check.  ** proce
17a40 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65  ssing (in sqlite
17a50 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61  3GenerateConstra
17a60 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20  intChecks()) as 
17a70 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44  part of.  ** UPD
17a80 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73  ATE and INSERT s
17a90 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a  tatements.  .  *
17aa0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
17ab0 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
17ac0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
17ad0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
17ae0 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
17af0 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
17b00 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
17b10 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
17b20 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
17b30 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
17b40 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
17b50 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
17b60 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
17b70 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
17b80 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
17b90 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
17ba0 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
17bb0 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
17bc0 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
17bd0 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
17be0 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
17bf0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
17c00 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
17c10 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
17c20 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
17c30 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
17c40 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
17c50 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  pRet = pIndex;. 
17c60 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
17c70 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
17c80 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  p before exiting
17c90 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f   */.exit_create_
17ca0 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e  index:.  if( pIn
17cb0 64 65 78 20 29 20 66 72 65 65 49 6e 64 65 78 28  dex ) freeIndex(
17cc0 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73  db, pIndex);.  s
17cd0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
17ce0 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a  (db, pPIWhere);.
17cf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
17d00 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
17d10 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
17d20 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
17d30 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
17d40 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
17d50 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
17d60 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  Ret;.}../*.** Fi
17d70 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  ll the Index.aiR
17d80 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69  owEst[] array wi
17d90 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72  th default infor
17da0 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61  mation - informa
17db0 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73  tion.** to be us
17dc0 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  ed when we have 
17dd0 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c  not run the ANAL
17de0 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
17df0 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69  ** aiRowEst[0] i
17e00 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e  s suppose to con
17e10 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
17e20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
17e30 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e  he index..** Sin
17e40 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ce we do not kno
17e50 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69  w, guess 1 milli
17e60 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d  on.  aiRowEst[1]
17e70 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
17e80 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
17e90 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
17ea0 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
17eb0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
17ec0 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
17ed0 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
17ee0 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f  the index.  aiRo
17ef0 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73  wEst[2] is an es
17f00 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
17f10 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
17f20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
17f30 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
17f40 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  iation of the fi
17f50 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  rst 2 columns.**
17f60 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
17f70 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
17f80 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  t must always be
17f90 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
17fa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
17fb0 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77  RowEst[N]<=aiRow
17fc0 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20  Est[N-1].**     
17fd0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
17fe0 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74  ]>=1.**.** Apart
17ff0 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68   from that, we h
18000 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f  ave little to go
18010 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75   on besides intu
18020 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68  ition as to.** h
18030 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68  ow aiRowEst[] sh
18040 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69  ould be initiali
18050 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  zed.  The number
18060 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65  s generated here
18070 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e  .** are based on
18080 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20   typical values 
18090 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20  found in actual 
180a0 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  indices..*/.void
180b0 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
180c0 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64  owEst(Index *pId
180d0 78 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61  x){.  tRowcnt *a
180e0 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73   = pIdx->aiRowEs
180f0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 74 52  t;.  int i;.  tR
18100 6f 77 63 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72  owcnt n;.  asser
18110 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30  t( a!=0 );.  a[0
18120 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  ] = pIdx->pTable
18130 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 69 66 28  ->nRowEst;.  if(
18140 20 61 5b 30 5d 3c 31 30 20 29 20 61 5b 30 5d 20   a[0]<10 ) a[0] 
18150 3d 20 31 30 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a  = 10;.  n = 10;.
18160 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 49    for(i=1; i<=pI
18170 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
18180 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 6e 3b  ){.    a[i] = n;
18190 0a 20 20 20 20 69 66 28 20 6e 3e 35 20 29 20 6e  .    if( n>5 ) n
181a0 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  --;.  }.  if( pI
181b0 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
181c0 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49  None ){.    a[pI
181d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31  dx->nColumn] = 1
181e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
181f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
18200 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
18210 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
18220 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
18230 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
18240 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
18250 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
18260 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
18270 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
18280 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
18290 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
182a0 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
182b0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
182c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
182d0 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
182e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
182f0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f  ->nErr==0 );   /
18300 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
18310 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
18320 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
18330 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
18340 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
18350 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
18360 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
18370 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
18380 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
18390 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
183a0 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
183b0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
183c0 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
183d0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
183e0 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
183f0 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
18400 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
18410 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
18420 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
18430 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
18440 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18450 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
18460 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
18470 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
18480 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
18490 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
184a0 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  ma(pParse, pName
184b0 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
184c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
184d0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
184e0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 1;.    goto e
184f0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
18500 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78    }.  if( pIndex
18510 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20  ->autoIndex ){. 
18520 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18530 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
18540 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
18550 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
18560 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
18570 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
18580 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
18590 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
185a0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
185b0 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
185c0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
185d0 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
185e0 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
185f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
18600 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
18610 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
18620 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
18630 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
18640 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
18650 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
18660 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
18670 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
18680 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
18690 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
186a0 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
186b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
186c0 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
186d0 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
186e0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
186f0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
18700 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
18710 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
18720 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
18730 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
18740 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
18750 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
18760 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
18770 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
18780 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
18790 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
187a0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
187b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
187c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
187d0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
187e0 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
187f0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
18800 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
18810 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
18820 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
18830 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
18840 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
18850 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
18860 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
18870 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
18880 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
18890 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20  s WHERE name=%Q 
188a0 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
188b0 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
188c0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
188d0 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
188e0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
188f0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
18900 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
18910 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69  (pParse, iDb, "i
18920 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  dx", pIndex->zNa
18930 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
18940 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
18950 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64  rse, iDb);.    d
18960 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
18970 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
18980 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
18990 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
189a0 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
189b0 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e  , iDb, 0, 0, pIn
189c0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
189d0 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
189e0 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
189f0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
18a00 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
18a10 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f  * pArray is a po
18a20 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61  inter to an arra
18a30 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61  y of objects. Ea
18a40 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
18a50 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45  .** array is szE
18a60 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69  ntry bytes in si
18a70 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ze. This routine
18a80 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52   uses sqlite3DbR
18a90 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65  ealloc().** to e
18aa0 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20  xtend the array 
18ab0 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
18ac0 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
18ad0 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65   object at the e
18ae0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  nd..**.** When t
18af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18b00 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79  called, *pnEntry
18b10 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75   contains the cu
18b20 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a  rrent size of.**
18b30 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65   the array (in e
18b40 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20  ntries - so the 
18b50 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28  allocation is ((
18b60 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e  *pnEntry) * szEn
18b70 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e  try) bytes.** in
18b80 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49   total)..**.** I
18b90 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
18ba0 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69  is successful (i
18bb0 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f  .e. if no OOM co
18bc0 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c  ndition occurs),
18bd0 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c   the.** space al
18be0 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
18bf0 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65  new object is ze
18c00 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75  roed, *pnEntry u
18c10 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66  pdated to.** ref
18c20 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a  lect the new siz
18c30 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61  e of the array a
18c40 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
18c50 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
18c60 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  on.** returned. 
18c70 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
18c80 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
18c90 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79   new array entry
18ca0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
18cb0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
18cc0 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  if the realloc()
18cd0 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73   fails, *pIdx is
18ce0 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45   set to -1, *pnE
18cf0 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20  ntry remains.** 
18d00 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
18d10 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72  copy of pArray r
18d20 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  eturned..*/.void
18d30 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
18d40 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
18d50 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
18d60 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
18d70 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
18d80 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
18d90 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
18da0 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
18db0 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
18dc0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
18dd0 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
18de0 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
18df0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
18e00 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ray */.  int *pn
18e10 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
18e20 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
18e30 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
18e40 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20   */.  int *pIdx 
18e50 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18e60 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
18e70 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f  new slot here */
18e80 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
18e90 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72   int n = *pnEntr
18ea0 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e  y;.  if( (n & (n
18eb0 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  -1))==0 ){.    i
18ec0 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f  nt sz = (n==0) ?
18ed0 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f   1 : 2*n;.    vo
18ee0 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  id *pNew = sqlit
18ef0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
18f00 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74  pArray, sz*szEnt
18f10 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
18f20 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
18f30 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
18f40 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
18f50 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20     }.    pArray 
18f60 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
18f70 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
18f80 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a  .  memset(&z[n *
18f90 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
18fa0 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20  Entry);.  *pIdx 
18fb0 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72  = n;.  ++*pnEntr
18fc0 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72  y;.  return pArr
18fd0 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ay;.}../*.** App
18fe0 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
18ff0 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
19000 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
19010 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
19020 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
19030 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
19040 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
19050 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
19060 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
19070 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
19080 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  pend(sqlite3 *db
19090 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
190a0 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
190b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
190c0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
190d0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
190e0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
190f0 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
19100 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
19110 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19120 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
19130 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
19140 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
19150 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
19160 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
19170 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
19180 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20   &pList->nId,.  
19190 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66      &i.  );.  if
191a0 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( i<0 ){.    sql
191b0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
191c0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
191d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
191e0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
191f0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
19200 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
19210 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  oken);.  return 
19220 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
19230 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
19240 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19250 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71  3IdListDelete(sq
19260 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
19270 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
19280 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
19290 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
192a0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
192b0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
192c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
192d0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
192e0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
192f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
19300 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
19310 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
19320 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
19330 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
19340 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
19350 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
19360 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
19370 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
19380 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
19390 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
193a0 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
193b0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
193c0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
193d0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
193e0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
193f0 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
19400 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
19410 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
19420 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
19430 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
19440 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
19450 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61  1;.}../*.** Expa
19460 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  nd the space all
19470 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67  ocated for the g
19480 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a  iven SrcList obj
19490 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69  ect by.** creati
194a0 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c  ng nExtra new sl
194b0 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ots beginning at
194c0 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74   iStart.  iStart
194d0 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a   is zero based..
194e0 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65  ** New slots are
194f0 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46   zeroed..**.** F
19500 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70  or example, supp
19510 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e  ose a SrcList in
19520 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  itially contains
19530 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c   two entries: A,
19540 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20  B..** To append 
19550 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e  3 new entries on
19560 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74  to the end, do t
19570 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  his:.**.**    sq
19580 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
19590 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74  rge(db, pSrclist
195a0 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41  , 3, 2);.**.** A
195b0 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62  fter the call ab
195c0 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e  ove it would con
195d0 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c  tain:  A, B, nil
195e0 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49  , nil, nil..** I
195f0 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67  f the iStart arg
19600 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31  ument had been 1
19610 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74   instead of 2, t
19620 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
19630 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
19640 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  n:  A, nil, nil,
19650 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65   nil, B.  To pre
19660 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f  pend the new slo
19670 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72  ts,.** the iStar
19680 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65  t value would be
19690 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20   0.  The result 
196a0 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65  then would.** be
196b0 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  : nil, nil, nil,
196c0 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   A, B..**.** If 
196d0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
196e0 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72  ion fails the Sr
196f0 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67  cList is unchang
19700 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e  ed.  The.** db->
19710 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
19720 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  g will be set to
19730 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   true..*/.SrcLis
19740 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
19750 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69  tEnlarge(.  sqli
19760 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f  te3 *db,       /
19770 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
19780 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
19790 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f  of OOM errors */
197a0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
197b0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63  ,     /* The Src
197c0 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72  List to be enlar
197d0 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ged */.  int nEx
197e0 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  tra,        /* N
197f0 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f  umber of new slo
19800 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72  ts to add to pSr
19810 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  c->a[] */.  int 
19820 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f  iStart         /
19830 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d  * Index in pSrc-
19840 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65  >a[] of first ne
19850 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69  w slot */.){.  i
19860 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nt i;..  /* Sani
19870 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63  ty checking on c
19880 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72  alling parameter
19890 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
198a0 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73  Start>=0 );.  as
198b0 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20  sert( nExtra>=1 
198c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
198d0 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
198e0 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e  ( iStart<=pSrc->
198f0 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  nSrc );..  /* Al
19900 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61  locate additiona
19910 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65  l space if neede
19920 64 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d  d */.  if( pSrc-
19930 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72  >nSrc+nExtra>pSr
19940 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  c->nAlloc ){.   
19950 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
19960 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d      int nAlloc =
19970 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74   pSrc->nSrc+nExt
19980 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74  ra;.    int nGot
19990 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
199a0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
199b0 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20  , pSrc,.        
199c0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
199d0 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31  Src) + (nAlloc-1
199e0 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )*sizeof(pSrc->a
199f0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
19a00 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
19a10 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
19a20 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
19a30 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a     return pSrc;.
19a40 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d      }.    pSrc =
19a50 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20   pNew;.    nGot 
19a60 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  = (sqlite3DbMall
19a70 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29  ocSize(db, pNew)
19a80 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29   - sizeof(*pSrc)
19a90 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )/sizeof(pSrc->a
19aa0 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63  [0])+1;.    pSrc
19ab0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 6e  ->nAlloc = (u8)n
19ac0 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Got;.  }..  /* M
19ad0 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f  ove existing slo
19ae0 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74  ts that come aft
19af0 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73  er the newly ins
19b00 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a  erted slots.  **
19b10 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
19b20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  */.  for(i=pSrc-
19b30 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61  >nSrc-1; i>=iSta
19b40 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53  rt; i--){.    pS
19b50 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20  rc->a[i+nExtra] 
19b60 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  = pSrc->a[i];.  
19b70 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b  }.  pSrc->nSrc +
19b80 3d 20 28 69 38 29 6e 45 78 74 72 61 3b 0a 0a 20  = (i8)nExtra;.. 
19b90 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
19ba0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
19bb0 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
19bc0 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
19bd0 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
19be0 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
19bf0 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
19c00 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
19c10 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
19c20 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
19c30 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
19c40 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19c50 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
19c60 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
19c70 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
19c80 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
19c90 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
19ca0 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
19cb0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
19cc0 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
19cd0 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
19ce0 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
19cf0 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
19d00 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
19d10 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
19d20 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
19d30 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
19d40 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
19d50 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  or.  The returne
19d60 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67  d.** SrcList mig
19d70 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
19d80 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  s the SrcList th
19d90 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20  at was input or 
19da0 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  it might be.** a
19db0 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e   new one.  If an
19dc0 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20   OOM error does 
19dd0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
19de0 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20   prior value of 
19df0 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73  pList.** that is
19e00 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
19e10 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61  outine is automa
19e20 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  tically freed..*
19e30 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
19e40 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
19e50 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
19e60 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
19e70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
19e80 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
19e90 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
19ea0 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
19eb0 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
19ec0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
19ed0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
19ee0 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
19ef0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19f00 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
19f10 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
19f20 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
19f30 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
19f40 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
19f50 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
19f60 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
19f70 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
19f80 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
19f90 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
19fa0 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
19fb0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
19fc0 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
19fd0 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
19fe0 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
19ff0 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
1a000 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
1a010 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
1a020 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1a030 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1a040 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1a050 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,0);.**.** T
1a060 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
1a070 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
1a080 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
1a090 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
1a0a0 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
1a0b0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1a0c0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1a0d0 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29  tAppend(D,A,B,C)
1a0e0 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
1a0f0 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
1a100 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
1a110 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66  tabase name.  If
1a120 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a   C is defined.**
1a130 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20   then so is B.  
1a140 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1a150 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  we never have a 
1a160 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a  case where:.**.*
1a170 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1a180 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1a190 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42  ,A,0,C);.**.** B
1a1a0 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70  oth pTable and p
1a1b0 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73  Database are ass
1a1c0 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65  umed to be quote
1a1d0 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71  d.  They are deq
1a1e0 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  uoted.** before 
1a1f0 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
1a200 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53  he SrcList..*/.S
1a210 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1a220 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  rcListAppend(.  
1a230 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1a240 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1a250 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1a260 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1a270 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  /.  SrcList *pLi
1a280 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  st,     /* Appen
1a290 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73  d to this SrcLis
1a2a0 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20  t. NULL creates 
1a2b0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f  a new SrcList */
1a2c0 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1a2d0 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ,      /* Table 
1a2e0 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54  to append */.  T
1a2f0 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20  oken *pDatabase 
1a300 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
1a310 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  f the table */.)
1a320 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1a330 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1a340 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62    assert( pDatab
1a350 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ase==0 || pTable
1a360 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  !=0 );  /* Canno
1a370 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74  t have C without
1a380 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73   B */.  if( pLis
1a390 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1a3a0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1a3b0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1a3c0 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
1a3d0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1a3e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a3f0 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
1a400 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  1;.  }.  pList =
1a410 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1a420 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74  nlarge(db, pList
1a430 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63  , 1, pList->nSrc
1a440 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1a450 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1a460 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1a470 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1a480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1a490 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1a4a0 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
1a4b0 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44  Src-1];.  if( pD
1a4c0 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
1a4d0 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
1a4e0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
1a4f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
1a500 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  base ){.    Toke
1a510 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
1a520 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
1a530 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
1a540 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
1a550 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
1a560 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1a570 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1a580 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d  pTable);.  pItem
1a590 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
1a5a0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a5b0 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
1a5c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
1a5d0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
1a5e0 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e  gn VdbeCursor in
1a5f0 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61  dex numbers to a
1a600 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
1a610 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
1a620 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1a630 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
1a640 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1a650 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1a660 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
1a670 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1a680 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
1a690 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1a6a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a6b0 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
1a6c0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
1a6d0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
1a6e0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1a6f0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1a700 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
1a710 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
1a720 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
1a730 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
1a740 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
1a750 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
1a760 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a770 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1a780 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
1a790 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
1a7a0 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
1a7b0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1a7c0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
1a7d0 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
1a7e0 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
1a7f0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
1a800 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1a810 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1a820 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  b, SrcList *pLis
1a830 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
1a840 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1a850 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
1a860 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1a870 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
1a880 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1a890 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1a8a0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1a8b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a8c0 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  b, pItem->zDatab
1a8d0 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
1a8e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1a8f0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
1a900 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a910 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1a920 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1a930 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49  ee(db, pItem->zI
1a940 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
1a950 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
1a960 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
1a970 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1a980 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1a990 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
1a9a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1a9b0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f  te(db, pItem->pO
1a9c0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
1a9d0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1a9e0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  pItem->pUsing);.
1a9f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1aa00 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
1aa10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1aa20 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1aa30 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
1aa40 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
1aa50 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
1aa60 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
1aa70 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
1aa80 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1aa90 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
1aaa0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
1aab0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1aac0 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
1aad0 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
1aae0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1aaf0 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
1ab00 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
1ab10 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1ab20 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
1ab30 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1ab40 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
1ab50 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1ab60 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
1ab70 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1ab80 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
1ab90 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
1aba0 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
1abb0 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
1abc0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
1abd0 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20  s a alias, then 
1abe0 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f  pAlias points to
1abf0 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f   the.** alias to
1ac00 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72  ken.  If the ter
1ac10 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c  m is a subquery,
1ac20 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20   then pSubquery 
1ac30 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54  is the.** SELECT
1ac40 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
1ac50 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63  the subquery enc
1ac60 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c  odes.  The pTabl
1ac70 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61  e and.** pDataba
1ac80 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  se parameters ar
1ac90 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75  e NULL for subqu
1aca0 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20  eries.  The pOn 
1acb0 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61  and pUsing.** pa
1acc0 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65  rameters are the
1acd0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1ace0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1acf0 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  uses..**.** Retu
1ad00 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  rn a new SrcList
1ad10 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69   which encodes i
1ad20 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20  s the FROM with 
1ad30 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20  the new.** term 
1ad40 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73  added..*/.SrcLis
1ad50 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1ad60 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
1ad70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ad80 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1ad90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1ada0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20  .  SrcList *p,  
1adb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1adc0 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74  e left part of t
1add0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61  he FROM clause a
1ade0 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20  lready seen */. 
1adf0 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1ae00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1ae10 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
1ae20 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d   add to the FROM
1ae30 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b   clause */.  Tok
1ae40 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20  en *pDatabase,  
1ae50 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ae60 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1ae70 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a  taining pTable *
1ae80 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61  /.  Token *pAlia
1ae90 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  s,          /* T
1aea0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
1aeb0 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62  de of the AS sub
1aec0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1aed0 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
1aee0 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  y,      /* A sub
1aef0 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c  query used in pl
1af00 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e  ace of a table n
1af10 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
1af20 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  On,             
1af30 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73   /* The ON claus
1af40 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20  e of a join */. 
1af50 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20   IdList *pUsing 
1af60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1af70 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
1af80 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73  a join */.){.  s
1af90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1afa0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
1afb0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1afc0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20  e->db;.  if( !p 
1afd0 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e  && (pOn || pUsin
1afe0 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
1aff0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b000 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
1b010 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
1b020 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
1b030 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55  (pOn ? "ON" : "U
1b040 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20  SING").    );.  
1b050 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72    goto append_fr
1b060 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  om_error;.  }.  
1b070 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
1b080 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
1b090 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
1b0a0 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
1b0b0 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d  | NEVER(p->nSrc=
1b0c0 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =0) ){.    goto 
1b0d0 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1b0e0 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  r;.  }.  pItem =
1b0f0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1b100 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c  ];.  assert( pAl
1b110 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ias!=0 );.  if( 
1b120 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20  pAlias->n ){.   
1b130 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pItem->zAlias =
1b140 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1b150 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73  Token(db, pAlias
1b160 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  );.  }.  pItem->
1b170 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75  pSelect = pSubqu
1b180 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f  ery;.  pItem->pO
1b190 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d  n = pOn;.  pItem
1b1a0 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e  ->pUsing = pUsin
1b1b0 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a  g;.  return p;..
1b1c0 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1b1d0 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d  or:.  assert( p=
1b1e0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
1b1f0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f  xprDelete(db, pO
1b200 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c  n);.  sqlite3IdL
1b210 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55  istDelete(db, pU
1b220 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  sing);.  sqlite3
1b230 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1b240 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72   pSubquery);.  r
1b250 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1b260 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44  * Add an INDEXED
1b270 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58   BY or NOT INDEX
1b280 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  ED clause to the
1b290 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
1b2a0 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74  dded .** element
1b2b0 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   of the source-l
1b2c0 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
1b2d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1b2e0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1b2f0 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64  e3SrcListIndexed
1b300 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  By(Parse *pParse
1b310 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f  , SrcList *p, To
1b320 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29  ken *pIndexedBy)
1b330 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64  {.  assert( pInd
1b340 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69  exedBy!=0 );.  i
1b350 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
1b360 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20  ->nSrc>0) ){.   
1b370 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1b380 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1b390 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1b3a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1b3b0 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  m->notIndexed==0
1b3c0 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65   && pItem->zInde
1b3d0 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  x==0 );.    if( 
1b3e0 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31  pIndexedBy->n==1
1b3f0 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d   && !pIndexedBy-
1b400 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  >z ){.      /* A
1b410 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
1b420 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69  lause was suppli
1b430 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20  ed. See parse.y 
1b440 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  .      ** constr
1b450 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74  uct "indexed_opt
1b460 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a  " for details. *
1b470 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e  /.      pItem->n
1b480 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20  otIndexed = 1;. 
1b490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b4a0 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20  pItem->zIndex = 
1b4b0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1b4c0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1b4d0 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
1b4e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1b4f0 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
1b500 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
1b510 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
1b520 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1b530 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
1b540 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
1b550 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
1b560 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
1b570 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
1b580 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
1b590 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
1b5a0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
1b5b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1b5c0 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
1b5d0 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
1b5e0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
1b5f0 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
1b600 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
1b610 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
1b620 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
1b630 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1b640 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
1b650 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
1b660 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
1b670 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
1b680 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
1b690 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
1b6a0 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
1b6b0 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
1b6c0 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
1b6d0 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
1b6e0 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
1b6f0 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
1b700 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
1b710 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
1b720 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
1b730 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
1b740 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1b750 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
1b760 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
1b770 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
1b780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1b790 61 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20  a || p->nSrc==0 
1b7a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e  );.    for(i=p->
1b7b0 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  nSrc-1; i>0; i--
1b7c0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d  ){.      p->a[i]
1b7d0 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61  .jointype = p->a
1b7e0 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a  [i-1].jointype;.
1b7f0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30      }.    p->a[0
1b800 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  ].jointype = 0;.
1b810 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67    }.}../*.** Beg
1b820 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1b830 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b840 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
1b850 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b860 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
1b870 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
1b880 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
1b890 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1b8a0 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
1b8b0 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
1b8c0 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20  t( db!=0 );./*  
1b8d0 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  if( db->aDb[0].p
1b8e0 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  Bt==0 ) return; 
1b8f0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1b900 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1b910 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1b920 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
1b930 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1b940 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1b950 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1b960 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
1b970 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
1b980 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
1b990 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
1b9a0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1b9b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1b9c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b9d0 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
1b9e0 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
1b9f0 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73  IVE)+1);.      s
1ba00 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
1ba10 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d  ree(v, i);.    }
1ba20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1ba30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1ba40 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  utoCommit, 0, 0)
1ba50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1ba60 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
1ba70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1ba80 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
1ba90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1baa0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1bab0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1bac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1bad0 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
1bae0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1baf0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1bb00 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1bb10 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1bb20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
1bb30 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
1bb40 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1bb50 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1bb60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bb70 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
1bb80 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  mmit, 1, 0);.  }
1bb90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1bba0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1bbb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1bbc0 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
1bbd0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1bbe0 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  e){.  Vdbe *v;..
1bbf0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1bc00 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1bc10 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
1bc20 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
1bc30 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1bc40 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1bc50 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  ION, "ROLLBACK",
1bc60 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1bc70 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1bc80 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1bc90 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1bca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1bcb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1bcc0 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29  utoCommit, 1, 1)
1bcd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1bce0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1bcf0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1bd00 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72  rser when it par
1bd10 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f  ses a command to
1bd20 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65   create,.** rele
1bd30 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
1bd40 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74  an SQL savepoint
1bd50 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
1bd60 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73  e3Savepoint(Pars
1bd70 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
1bd80 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  p, Token *pName)
1bd90 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
1bda0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1bdb0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1bdc0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
1bdd0 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64   zName ){.    Vd
1bde0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
1bdf0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1be00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1be10 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
1be20 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  N.    static con
1be30 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
1be40 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22  az[] = { "BEGIN"
1be50 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f  , "RELEASE", "RO
1be60 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61  LLBACK" };.    a
1be70 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e  ssert( !SAVEPOIN
1be80 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50  T_BEGIN && SAVEP
1be90 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20  OINT_RELEASE==1 
1bea0 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  && SAVEPOINT_ROL
1beb0 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64  LBACK==2 );.#end
1bec0 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c  if.    if( !v ||
1bed0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1bee0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1bef0 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f  _SAVEPOINT, az[o
1bf00 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b  p], zName, 0) ){
1bf10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1bf20 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1bf30 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72   zName);.      r
1bf40 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
1bf50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bf60 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69  p4(v, OP_Savepoi
1bf70 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e  nt, op, 0, 0, zN
1bf80 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ame, P4_DYNAMIC)
1bf90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
1bfa0 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
1bfb0 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
1bfc0 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
1bfd0 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
1bfe0 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
1bff0 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
1c000 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
1c010 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
1c020 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
1c030 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e  .int sqlite3Open
1c040 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72  TempDatabase(Par
1c050 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
1c060 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1c070 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
1c080 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
1c090 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
1c0a0 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
1c0b0 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  rc;.    Btree *p
1c0c0 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  Bt;.    static c
1c0d0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
1c0e0 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
1c0f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1c100 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
1c110 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1c120 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1c130 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1c140 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  VE |.          S
1c150 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1c160 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
1c170 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1c180 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72  _TEMP_DB;..    r
1c190 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c1a0 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30  Open(db->pVfs, 0
1c1b0 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66  , db, &pBt, 0, f
1c1c0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
1c1d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c1f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1c200 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
1c210 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
1c220 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
1c230 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
1c240 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
1c250 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
1c260 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
1c270 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1c280 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70      db->aDb[1].p
1c290 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73  Bt = pBt;.    as
1c2a0 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d  sert( db->aDb[1]
1c2b0 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
1c2c0 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  if( SQLITE_NOMEM
1c2d0 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  ==sqlite3BtreeSe
1c2e0 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64  tPageSize(pBt, d
1c2f0 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c  b->nextPagesize,
1c300 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20   -1, 0) ){.     
1c310 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1c320 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  d = 1;.      ret
1c330 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1c340 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1c350 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
1c360 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69  DBE code that wi
1c370 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63  ll verify the sc
1c380 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20  hema cookie and 
1c390 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d  start.** a read-
1c3a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1c3b0 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61  all named databa
1c3c0 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  se files..**.** 
1c3d0 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
1c3e0 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20  that all schema 
1c3f0 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66  cookies be verif
1c400 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72  ied and all.** r
1c410 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ead transactions
1c420 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1c430 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  re anything else
1c440 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74   happens in.** t
1c450 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
1c460 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
1c470 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ne can be called
1c480 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65   after much othe
1c490 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65  r.** code has be
1c4a0 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53  en generated.  S
1c4b0 6f 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77  o here is what w
1c4c0 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e do:.**.** The 
1c4d0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
1c4e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1c4f0 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50  d, we code an OP
1c500 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69  _Goto that.** wi
1c510 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62  ll jump to a sub
1c520 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65  routine at the e
1c530 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  nd of the progra
1c540 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72  m.  Then we.** r
1c550 65 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61  ecord every data
1c560 62 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20  base that needs 
1c570 69 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66  its schema verif
1c580 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50  ied in the.** pP
1c590 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1c5a0 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20   field.  Later, 
1c5b0 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20  after all other 
1c5c0 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a  code has been.**
1c5d0 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20   generated, the 
1c5e0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1c5f0 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20  does the cookie 
1c600 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e  verifications an
1c610 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20  d.** starts the 
1c620 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c  transactions wil
1c630 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74  l be coded and t
1c640 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61  he OP_Goto P2 va
1c650 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d  lue.** will be m
1c660 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
1c670 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  that subroutine.
1c680 20 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e    The generation
1c690 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69   of the.** cooki
1c6a0 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73  e verification s
1c6b0 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68  ubroutine code h
1c6c0 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65  appens in sqlite
1c6d0 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
1c6e0 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20  .**.** If iDb<0 
1c6f0 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50  then code the OP
1c700 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e  _Goto only - don
1c710 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76  't set flag to v
1c720 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68  erify the.** sch
1c730 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62  ema on any datab
1c740 61 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20  ases.  This can 
1c750 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74  be used to posit
1c760 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a  ion the OP_Goto.
1c770 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20  ** early in the 
1c780 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20  code, before we 
1c790 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61  know if any data
1c7a0 62 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c  base tables will
1c7b0 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69   be used..*/.voi
1c7c0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
1c7d0 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
1c7e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
1c7f0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1c800 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1c810 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1c820 72 73 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  rse);..#ifndef S
1c830 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1c840 45 52 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76  ER.  if( pToplev
1c850 65 6c 21 3d 70 50 61 72 73 65 20 29 7b 0a 20 20  el!=pParse ){.  
1c860 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
1c870 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 20 74   is taken if a t
1c880 72 69 67 67 65 72 20 69 73 20 63 75 72 72 65 6e  rigger is curren
1c890 74 6c 79 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  tly being coded.
1c8a0 20 49 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   In this.    ** 
1c8b0 63 61 73 65 2c 20 73 65 74 20 63 6f 6f 6b 69 65  case, set cookie
1c8c0 47 6f 74 6f 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  Goto to a non-ze
1c8d0 72 6f 20 76 61 6c 75 65 20 74 6f 20 73 68 6f 77  ro value to show
1c8e0 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
1c8f0 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
1c900 65 65 6e 20 63 61 6c 6c 65 64 2e 20 54 68 69 73  een called. This
1c910 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
1c920 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1c930 6f 6e 73 74 61 6e 74 73 28 29 0a 20 20 20 20 2a  onstants().    *
1c940 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  * function. */. 
1c950 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1c960 65 47 6f 74 6f 20 3d 20 2d 31 3b 0a 20 20 7d 0a  eGoto = -1;.  }.
1c970 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 54 6f  #endif.  if( pTo
1c980 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f  plevel->cookieGo
1c990 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  to==0 ){.    Vdb
1c9a0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
1c9b0 74 56 64 62 65 28 70 54 6f 70 6c 65 76 65 6c 29  tVdbe(pToplevel)
1c9c0 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
1c9d0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69   return;  /* Thi
1c9e0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  s only happens i
1c9f0 66 20 74 68 65 72 65 20 77 61 73 20 61 20 70 72  f there was a pr
1ca00 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  ior error */.   
1ca10 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1ca20 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  ieGoto = sqlite3
1ca30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ca40 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a  _Goto, 0, 0)+1;.
1ca50 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30    }.  if( iDb>=0
1ca60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
1ca70 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d  *db = pToplevel-
1ca80 3e 64 62 3b 0a 20 20 20 20 79 44 62 4d 61 73 6b  >db;.    yDbMask
1ca90 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 61 73 73 65   mask;..    asse
1caa0 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
1cab0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
1cac0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
1cad0 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
1cae0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
1caf0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
1cb00 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  HED+2 );.    ass
1cb10 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
1cb20 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1cb30 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d  iDb, 0) );.    m
1cb40 61 73 6b 20 3d 20 28 28 79 44 62 4d 61 73 6b 29  ask = ((yDbMask)
1cb50 31 29 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28  1)<<iDb;.    if(
1cb60 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f   (pToplevel->coo
1cb70 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  kieMask & mask)=
1cb80 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 70  =0 ){.      pTop
1cb90 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73  level->cookieMas
1cba0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1cbb0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b   pToplevel->cook
1cbc0 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
1cbd0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
1cbe0 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
1cbf0 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
1cc00 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
1cc10 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
1cc20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1cc30 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65  atabase(pTopleve
1cc40 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1cc50 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
1cc60 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69  f argument zDb i
1cc70 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c  s NULL, then cal
1cc80 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  l sqlite3CodeVer
1cc90 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20  ifySchema() for 
1cca0 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65  each .** attache
1ccb0 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65  d database. Othe
1ccc0 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74  rwise, invoke it
1ccd0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1cce0 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79  e named zDb only
1ccf0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1cd00 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
1cd10 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
1cd20 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
1cd30 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65   *zDb){.  sqlite
1cd40 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1cd50 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  db;.  int i;.  f
1cd60 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1cd70 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
1cd80 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
1cd90 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
1cda0 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c  >pBt && (!zDb ||
1cdb0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
1cdc0 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61  mp(zDb, pDb->zNa
1cdd0 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  me)) ){.      sq
1cde0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1cdf0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29  chema(pParse, i)
1ce00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1ce10 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
1ce20 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65  BE code that pre
1ce30 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20  pares for doing 
1ce40 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  an operation tha
1ce50 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
1ce60 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
1ce70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ce80 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  ne starts a new 
1ce90 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77  transaction if w
1cea0 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64  e are not alread
1ceb0 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72  y within.** a tr
1cec0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77  ansaction.  If w
1ced0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69  e are already wi
1cee0 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
1cef0 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b  on, then a check
1cf00 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20  point.** is set 
1cf10 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d  if the setStatem
1cf20 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ent parameter is
1cf30 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70   true.  A checkp
1cf40 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  oint should.** b
1cf50 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74  e set for operat
1cf60 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20  ions that might 
1cf70 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63  fail (due to a c
1cf80 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20  onstraint) part 
1cf90 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68  of.** the way th
1cfa0 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20  rough and which 
1cfb0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64  will need to und
1cfc0 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69  o some writes wi
1cfd0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a  thout having to.
1cfe0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
1cff0 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  whole transactio
1d000 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f  n.  For operatio
1d010 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e  ns where all con
1d020 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20  straints.** can 
1d030 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72  be checked befor
1d040 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72  e any changes ar
1d050 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
1d060 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65  tabase, it is ne
1d070 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79  ver.** necessary
1d080 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65   to undo a write
1d090 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f   and the checkpo
1d0a0 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  int should not b
1d0b0 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e set..*/.void s
1d0c0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1d0d0 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
1d0e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
1d0f0 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
1d100 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
1d110 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1d120 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1d130 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
1d140 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1d150 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
1d160 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69    pToplevel->wri
1d170 74 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d  teMask |= ((yDbM
1d180 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 70  ask)1)<<iDb;.  p
1d190 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
1d1a0 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
1d1b0 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
1d1c0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
1d1d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
1d1e0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1d1f0 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
1d200 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
1d210 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
1d220 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
1d230 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
1d240 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
1d250 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
1d260 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
1d270 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
1d280 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
1d290 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
1d2a0 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
1d2b0 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
1d2c0 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
1d2d0 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
1d2e0 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
1d2f0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
1d300 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
1d310 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
1d320 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
1d330 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
1d340 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
1d350 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1d360 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1d370 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
1d380 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
1d390 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
1d3a0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1d3b0 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
1d3c0 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
1d3d0 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
1d3e0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
1d3f0 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
1d400 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
1d410 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
1d420 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
1d430 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
1d440 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
1d450 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
1d460 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
1d470 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
1d480 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
1d490 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
1d4a0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
1d4b0 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
1d4c0 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
1d4d0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
1d4e0 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
1d4f0 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
1d500 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
1d510 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
1d520 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
1d530 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
1d540 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
1d550 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
1d560 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
1d570 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
1d580 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
1d590 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
1d5a0 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
1d5b0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
1d5c0 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
1d5d0 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
1d5e0 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
1d5f0 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
1d600 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
1d610 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
1d620 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
1d630 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
1d640 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
1d650 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
1d660 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
1d670 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
1d680 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1d690 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
1d6a0 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
1d6b0 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
1d6c0 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
1d6d0 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
1d6e0 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
1d6f0 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
1d700 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
1d710 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1d720 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1d730 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1d740 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1d750 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
1d760 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
1d770 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
1d780 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
1d790 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
1d7a0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
1d7b0 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
1d7c0 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
1d7d0 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
1d7e0 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
1d7f0 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
1d800 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
1d810 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1d820 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1d830 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
1d840 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
1d850 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1d860 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
1d870 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
1d880 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
1d890 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
1d8a0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
1d8b0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
1d8c0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
1d8d0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
1d8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
1d8f0 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
1d900 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20  nt p4type       
1d910 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
1d920 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
1d930 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
1d940 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1d950 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
1d960 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66 29  ( (errCode&0xff)
1d970 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
1d980 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45  INT );.  if( onE
1d990 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  rror==OE_Abort )
1d9a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79  {.    sqlite3May
1d9b0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20  Abort(pParse);. 
1d9c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1d9d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
1d9e0 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72  t, errCode, onEr
1d9f0 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79  ror, 0, p4, p4ty
1da00 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  pe);.}../*.** Ch
1da10 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
1da20 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
1da30 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1da40 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
1da50 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
1da60 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
1da70 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
1da80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1da90 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1daa0 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
1dab0 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
1dac0 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
1dad0 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
1dae0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
1daf0 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
1db00 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
1db10 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1db20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1db30 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1db40 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
1db50 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30  !=0 );.    if( 0
1db60 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1db70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
1db80 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1db90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1dba0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
1dbb0 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1dbc0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1dbd0 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
1dbe0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1dbf0 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
1dc00 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1dc10 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1dc20 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
1dc30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dc40 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1dc50 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
1dc60 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1dc70 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
1dc80 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1dc90 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
1dca0 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1dcb0 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1dcc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1dcd0 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
1dce0 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
1dcf0 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1dd00 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
1dd10 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
1dd20 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
1dd30 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
1dd40 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
1dd50 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1dd60 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
1dd70 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
1dd80 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
1dd90 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1dda0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1ddb0 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
1ddc0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1ddd0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1dde0 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
1ddf0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1de00 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1de10 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
1de20 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
1de30 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
1de40 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
1de50 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1de60 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
1de70 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1de80 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
1de90 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
1dea0 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
1deb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1dec0 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
1ded0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1dee0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1def0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1df00 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
1df30 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
1df40 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1df50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1df60 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1df70 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1df80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1df90 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1dfa0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1dfb0 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
1dfc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dfd0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1dfe0 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1dff0 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
1e000 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1e010 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
1e020 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
1e030 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1e040 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
1e050 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20  lMutexes(db) ); 
1e060 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73   /* Needed for s
1e070 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a  chema access */.
1e080 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
1e090 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
1e0a0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
1e0b0 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
1e0c0 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
1e0d0 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
1e0e0 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
1e0f0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
1e100 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
1e110 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
1e120 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
1e130 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
1e140 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
1e150 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1e160 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
1e170 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1e180 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1e190 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
1e1a0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
1e1b0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1d0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
1e1e0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1e1f0 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1e210 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
1e220 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1e230 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
1e240 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
1e250 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1e260 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
1e270 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
1e280 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
1e290 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
1e2a0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
1e2b0 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
1e2c0 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
1e2d0 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1e2e0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
1e2f0 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
1e300 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
1e310 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
1e320 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
1e330 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1e340 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
1e350 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1e360 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1e370 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1e380 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1e390 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
1e3a0 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
1e3b0 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
1e3c0 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
1e3d0 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
1e3e0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1e3f0 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
1e400 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
1e410 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
1e420 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
1e450 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1e460 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e470 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1e480 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1e490 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
1e4a0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1e4b0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1e4c0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1e4d0 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
1e4e0 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1e4f0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1e500 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e510 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
1e520 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1e530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1e540 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1e550 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1e560 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1e570 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1e580 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1e590 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
1e5a0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1e5b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
1e5c0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
1e5d0 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
1e5e0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1e5f0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1e600 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1e610 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1e620 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1e630 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1e640 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1e650 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1e660 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1e670 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1e680 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1e690 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
1e6a0 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  me1==0 ){.    re
1e6b0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1e6c0 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
1e6d0 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
1e6e0 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d  f( NEVER(pName2=
1e6f0 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  =0) || pName2->z
1e700 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
1e710 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
1e720 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
1e730 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
1e740 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1e750 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
1e760 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
1e770 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
1e780 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1e790 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
1e7a0 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
1e7b0 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  l, 0);.    if( p
1e7c0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
1e7d0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1e7e0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
1e7f0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1e800 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
1e810 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1e820 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
1e830 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
1e840 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1e850 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
1e860 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
1e870 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
1e880 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
1e890 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
1e8a0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1e8b0 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
1e8c0 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
1e8d0 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
1e8e0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1e8f0 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
1e900 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
1e910 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
1e920 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
1e930 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
1e940 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
1e950 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1e960 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
1e970 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
1e980 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1e990 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
1e9a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1e9b0 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
1e9c0 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
1e9d0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1e9e0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
1e9f0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1ea00 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1ea10 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1ea20 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
1ea30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1ea40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1ea50 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
1ea60 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
1ea70 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
1ea80 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1ea90 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63  Return a dynamic
1eaa0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79  ly allocated Key
1eab0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
1eac0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a  hat can be used.
1ead0 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52  ** with OP_OpenR
1eae0 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72  ead or OP_OpenWr
1eaf0 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  ite to access da
1eb00 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64  tabase index pId
1eb10 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  x..**.** If succ
1eb20 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65  essful, a pointe
1eb30 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72  r to the new str
1eb40 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e  ucture is return
1eb50 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
1eb60 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
1eb70 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1eb80 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
1eb90 33 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e  3DbFree(db, ) on
1eba0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a   the returned .*
1ebb0 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e  * pointer. If an
1ebc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f   error occurs (o
1ebd0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20  ut of memory or 
1ebe0 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  missing collatio
1ebf0 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c  n .** sequence),
1ec00 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1ec10 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  d and the state 
1ec20 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65  of pParse update
1ec30 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20  d to reflect.** 
1ec40 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65  the error..*/.Ke
1ec50 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e  yInfo *sqlite3In
1ec60 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65  dexKeyinfo(Parse
1ec70 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
1ec80 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
1ec90 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
1eca0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
1ecb0 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65  nt nBytes = size
1ecc0 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  of(KeyInfo) + (n
1ecd0 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f  Col-1)*sizeof(Co
1ece0 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a  llSeq*) + nCol;.
1ecf0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ed00 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
1ed10 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b  yInfo *pKey = (K
1ed20 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33  eyInfo *)sqlite3
1ed30 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1ed40 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28   nBytes);..  if(
1ed50 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65   pKey ){.    pKe
1ed60 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  y->db = pParse->
1ed70 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53  db;.    pKey->aS
1ed80 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
1ed90 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e  )&(pKey->aColl[n
1eda0 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  Col]);.    asser
1edb0 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f  t( &pKey->aSortO
1edc0 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28  rder[nCol]==&(((
1edd0 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65  u8 *)pKey)[nByte
1ede0 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  s]) );.    for(i
1edf0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
1ee00 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
1ee10 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
1ee20 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  ll[i];.      ass
1ee30 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20  ert( zColl );.  
1ee40 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
1ee50 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  i] = sqlite3Loca
1ee60 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
1ee70 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
1ee80 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1ee90 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
1eea0 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
1eeb0 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c  .    pKey->nFiel
1eec0 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20  d = (u16)nCol;. 
1eed0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
1eee0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
1eef0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ef00 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
1ef10 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1ef20 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.