/ Hex Artifact Content
Login

Artifact 3278345550d2b6cd9348d297f7acd22d900429eb:


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 43 6f 6c 2d 3e 73  _NONE;.  pCol->s
8370: 7a 45 73 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e  zEst = 1;.  p->n
8380: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
8390: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
83a0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
83b0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
83c0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
83d0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
83e0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
83f0: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
8400: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
8410: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
8420: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
8430: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
8440: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
8450: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
8460: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8470: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
8480: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
8490: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
84a0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
84b0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
84c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
84d0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
84e0: 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43  0 || NEVER(p->nC
84f0: 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol<1) ) return;.
8500: 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f    p->aCol[p->nCo
8510: 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  l-1].notNull = (
8520: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f  u8)onError;.}../
8530: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
8540: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
8550: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
8560: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
8570: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
8580: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
8590: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
85a0: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
85b0: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
85c0: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
85d0: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
85e0: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
85f0: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
8600: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
8610: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
8620: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8630: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
8640: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
8650: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
8660: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
8670: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
8680: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
8690: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
86a0: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
86b0: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
86c0: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
86d0: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
86e0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
86f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
8700: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
8710: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8740: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
8750: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
8760: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
8770: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8780: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
8790: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
87a0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
87b0: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
87c0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
87d0: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
87e0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  | SQLITE_AFF_NON
87f0: 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  E.** 'REAL'     
8800: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8810: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
8820: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8830: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
8840: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8850: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
8860: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
8870: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8880: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
8890: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
88a0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
88b0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
88c0: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
88d0: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
88e0: 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a  ar *zIn, u8 *psz
88f0: 45 73 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  Est){.  u32 h = 
8900: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
8910: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8920: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  IC;.  const char
8930: 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20   *zChar = 0;..  
8940: 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74  if( zIn==0 ) ret
8950: 75 72 6e 20 61 66 66 3b 0a 20 20 77 68 69 6c 65  urn aff;.  while
8960: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
8970: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
8980: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
8990: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
89a0: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
89b0: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
89c0: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
89d0: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
89e0: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
89f0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
8a00: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
8a10: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
8a20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8a30: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
8a40: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8a50: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
8a60: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
8a70: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8a80: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
8a90: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
8aa0: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
8ab0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
8ac0: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
8ad0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8ae0: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
8af0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8b00: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
8b10: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
8b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
8b30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
8b40: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8b50: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
8b60: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
8b70: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
8b80: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
8b90: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
8ba0: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
8bb0: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
8bc0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
8bd0: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
8be0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
8bf0: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
8c00: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
8c10: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
8c20: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
8c30: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8c40: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8c50: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8c60: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8c70: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
8c80: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8c90: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
8ca0: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
8cb0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8cc0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8cd0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8ce0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
8cf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8d00: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
8d10: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
8d20: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
8d30: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
8d40: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
8d50: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
8d60: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8d70: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
8d80: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
8d90: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
8da0: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
8db0: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
8dc0: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
8dd0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
8de0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
8df0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
8e00: 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69    /* If pszEst i
8e10: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72  s not NULL, stor
8e20: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  e an estimate of
8e30: 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e   the field size.
8e40: 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d    The.  ** estim
8e50: 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f  ate is scaled so
8e60: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
8e70: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20  f an integer is 
8e80: 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a  1.  */.  if( psz
8e90: 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45  Est ){.    *pszE
8ea0: 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66  st = 1;   /* def
8eb0: 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70  ault size is app
8ec0: 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20  rox 4 bytes */. 
8ed0: 20 20 20 69 66 28 20 61 66 66 3c 3d 53 51 4c 49     if( aff<=SQLI
8ee0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
8ef0: 20 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29       if( zChar )
8f00: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
8f10: 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20   zChar[0] ){.   
8f20: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8f30: 65 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b  e3Isdigit(zChar[
8f40: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
8f50: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
8f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
8f70: 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29  Int32(zChar, &v)
8f80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20  ;.            v 
8f90: 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20  = v/4 + 1;.     
8fa0: 20 20 20 20 20 20 20 69 66 28 20 76 3e 32 35 35         if( v>255
8fb0: 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20   ) v = 255;.    
8fc0: 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20          *pszEst 
8fd0: 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c  = v; /* BLOB(k),
8fe0: 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41   VARCHAR(k), CHA
8ff0: 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31  R(k) -> r=(k/4+1
9000: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
9010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9020: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43    }.          zC
9030: 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  har++;.        }
9040: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9050: 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20        *pszEst = 
9060: 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45  5;   /* BLOB, TE
9070: 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20  XT, CLOB -> r=5 
9080: 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65   (approx 20 byte
9090: 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s)*/.      }.   
90a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
90b0: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
90c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
90d0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
90e0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
90f0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9100: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
9110: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
9120: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
9130: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
9140: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
9150: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
9160: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
9170: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
9180: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
9190: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
91a0: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
91b0: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
91c0: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
91d0: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
91e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
91f0: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
9200: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
9210: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
9220: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
9230: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
9240: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
9250: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
9260: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
9270: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
9280: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
9290: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
92a0: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70   *pCol;..  p = p
92b0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
92c0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
92d0: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
92e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
92f0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9300: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nCol-1];.  asser
9310: 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d  t( pCol->zType==
9320: 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  0 );.  pCol->zTy
9330: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
9340: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
9350: 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20  ->db, pType);.  
9360: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
9370: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9380: 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Type(pCol->zType
9390: 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b  , &pCol->szEst);
93a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
93b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
93c0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
93d0: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
93e0: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
93f0: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
9400: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9410: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9420: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
9430: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
9440: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
9450: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
9460: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
9470: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
9480: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9490: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
94a0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
94b0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
94c0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
94d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
94e0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
94f0: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
9500: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
9510: 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a  arse, ExprSpan *
9520: 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20  pSpan){.  Table 
9530: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
9540: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
9550: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9560: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9570: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9580: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
9590: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
95a0: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
95b0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
95c0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
95d0: 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20  n(pSpan->pExpr) 
95e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
95f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9600: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
9610: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
9620: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
9630: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
9640: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
9650: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
9660: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
9670: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
9680: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
9690: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
96a0: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
96b0: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
96c0: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54  latile memory. T
96d0: 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65  he 'span' of the
96e0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
96f0: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
9700: 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65   by pragma table
9710: 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a  _info..      */.
9720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9730: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
9740: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
9750: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
9760: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9770: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45   pSpan->pExpr, E
9780: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
9790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
97a0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
97b0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
97c0: 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->zDflt = sqlite
97d0: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
97e0: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
97f0: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9810: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
9820: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
9830: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
9840: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9850: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
9860: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a   pSpan->pExpr);.
9870: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
9880: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
9890: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
98a0: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
98b0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
98c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
98d0: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
98e0: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
98f0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
9900: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
9910: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
9920: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
9930: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
9940: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
9950: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
9960: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
9970: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
9980: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
9990: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
99a0: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
99b0: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
99c0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
99d0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
99e0: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
99f0: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
9a00: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
9a10: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
9a20: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
9a30: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
9a40: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
9a50: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
9a60: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
9a70: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
9a80: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
9a90: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
9aa0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
9ab0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9ac0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
9ad0: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
9ae0: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
9af0: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
9b00: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
9b10: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
9b20: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
9b30: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
9b40: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
9b50: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
9b60: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
9b70: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
9b80: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
9b90: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
9ba0: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
9bb0: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
9bc0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
9bd0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9be0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9bf0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
9c00: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
9c10: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
9c20: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
9c30: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
9c40: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
9c50: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
9c60: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
9c70: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
9c80: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
9c90: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
9ca0: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
9cb0: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
9cc0: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
9cd0: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
9ce0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9cf0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9d00: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
9d10: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
9d20: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
9d30: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
9d40: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
9d50: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
9d60: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
9d70: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
9d80: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
9d90: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9da0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
9db0: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
9dc0: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
9dd0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
9de0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
9df0: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
9e00: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
9e10: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
9e20: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
9e30: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
9e40: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
9e50: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
9e60: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
9e70: 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col].colFlags |=
9e80: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
9e90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
9ea0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
9eb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9ec0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
9ed0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
9ee0: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
9ef0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
9f00: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
9f10: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
9f20: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
9f30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9f40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
9f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9f60: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
9f70: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  ol ){.        pT
9f80: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
9f90: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
9fa0: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
9fb0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9fc0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31  ( pList->nExpr>1
9fd0: 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20   ) iCol = -1;.  
9fe0: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20  }.  if( iCol>=0 
9ff0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
a000: 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  ol ){.    zType 
a010: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
a020: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20  l].zType;.  }.  
a030: 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c  if( zType && sql
a040: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70  ite3StrICmp(zTyp
a050: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
a060: 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74  .        && sort
a070: 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f  Order==SQLITE_SO
a080: 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62  _ASC ){.    pTab
a090: 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a  ->iPKey = iCol;.
a0a0: 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e      pTab->keyCon
a0b0: 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  f = (u8)onError;
a0c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74  .    assert( aut
a0d0: 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49  oInc==0 || autoI
a0e0: 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61  nc==1 );.    pTa
a0f0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61  b->tabFlags |= a
a100: 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e  utoInc*TF_Autoin
a110: 63 72 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73 65  crement;.  }else
a120: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
a130: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a140: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
a150: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
a160: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
a170: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
a180: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
a190: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
a1a0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a1b0: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
a1c0: 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  se{.    Index *p
a1d0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
a1e0: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
a1f0: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
a200: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
a210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a220: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
a230: 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20  ortOrder, 0);.  
a240: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
a250: 20 70 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20   p->autoIndex = 
a260: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  2;.    }.    pLi
a270: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
a280: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
a290: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a2a0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
a2b0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
a2c0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
a2d0: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
a2e0: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
a2f0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
a300: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
a310: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
a320: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
a330: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
a340: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
a350: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
a360: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
a370: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
a380: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
a390: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a3a0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
a3b0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
a3c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
a3d0: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49    if( pTab && !I
a3e0: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
a3f0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65  {.    pTab->pChe
a400: 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
a410: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
a420: 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c  e, pTab->pCheck,
a430: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
a440: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
a450: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29  nstraintName.n )
a460: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a470: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
a480: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
a490: 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f  eck, &pParse->co
a4a0: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29  nstraintName, 1)
a4b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
a4c0: 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73  #endif.  {.    s
a4d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
a4e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68  (pParse->db, pCh
a4f0: 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  eckExpr);.  }.}.
a500: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
a510: 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
a520: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
a530: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61  cently parsed ta
a540: 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f  ble column.** to
a550: 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76   the CollSeq giv
a560: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
a570: 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70  te3AddCollateTyp
a580: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a590: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
a5a0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
a5b0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43  nt i;.  char *zC
a5c0: 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
a5d0: 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61    /* Dequoted na
a5e0: 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  me of collation 
a5f0: 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71  sequence */.  sq
a600: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
a610: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
a620: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
a630: 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e  eturn;.  i = p->
a640: 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70  nCol-1;.  db = p
a650: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f  Parse->db;.  zCo
a660: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
a670: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
a680: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43  oken);.  if( !zC
a690: 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  oll ) return;.. 
a6a0: 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61   if( sqlite3Loca
a6b0: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
a6c0: 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
a6d0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
a6e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a6f0: 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  b, p->aCol[i].zC
a700: 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f  oll);.    p->aCo
a710: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f  l[i].zColl = zCo
a720: 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  ll;.  .    /* If
a730: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64   the column is d
a740: 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d  eclared as "<nam
a750: 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43  e> PRIMARY KEY C
a760: 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a  OLLATE <type>",.
a770: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69      ** then an i
a780: 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65  ndex may have be
a790: 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68  en created on th
a7a0: 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65  is column before
a7b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c   the.    ** coll
a7c0: 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61  ation type was a
a7d0: 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68  dded. Correct th
a7e0: 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20  is if it is the 
a7f0: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
a800: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
a810: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
a820: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
a830: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
a840: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ->nColumn==1 );.
a850: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
a860: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29  aiColumn[0]==i )
a870: 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  {.        pIdx->
a880: 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61  azColl[0] = p->a
a890: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[i].zColl;.  
a8a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
a8b0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
a8c0: 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
a8d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a8e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
a8f0: 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74  turns the collat
a900: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
a910: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
a920: 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e   text.** encodin
a930: 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  g identified by 
a940: 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  the string zName
a950: 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a  , length nName..
a960: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
a970: 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  uested collation
a980: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
a990: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e   available, or n
a9a0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  ot available.** 
a9b0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
a9c0: 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c  native encoding,
a9d0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
a9e0: 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65  actory is invoke
a9f0: 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20  d to.** request 
aa00: 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61  it. If the colla
aa10: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65  tion factory doe
aa20: 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63  s not supply suc
aa30: 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a  h a sequence,.**
aa40: 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63   and the sequenc
aa50: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  e is available i
aa60: 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65  n another text e
aa70: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68  ncoding, then th
aa80: 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  at is.** returne
aa90: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
aaa0: 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20   If no versions 
aab0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  of the requested
aac0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75   collations sequ
aad0: 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62  ence are availab
aae0: 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65  le, or.** anothe
aaf0: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  r error occurs, 
ab00: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
ab10: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   and an error me
ab20: 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e  ssage written in
ab30: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a  to.** pParse..**
ab40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ab50: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
ab60: 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64  ound sqlite3Find
ab70: 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73  CollSeq().  This
ab80: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f   routine.** invo
ab90: 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  kes the collatio
aba0: 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65  n factory if the
abb0: 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e   named collation
abc0: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
abd0: 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
abe0: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
abf0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ge..**.** See al
ac00: 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43  so: sqlite3FindC
ac10: 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65  ollSeq(), sqlite
ac20: 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f  3GetCollSeq().*/
ac30: 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65  .CollSeq *sqlite
ac40: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50  3LocateCollSeq(P
ac50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
ac60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
ac70: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
ac80: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ac90: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  u8 enc = ENC(db)
aca0: 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20  ;.  u8 initbusy 
acb0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b  = db->init.busy;
acc0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
acd0: 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  l;..  pColl = sq
ace0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
acf0: 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c  (db, enc, zName,
ad00: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
ad10: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
ad20: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
ad30: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
ad40: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
ad50: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
ad60: 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61   enc, pColl, zNa
ad70: 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  me);.  }..  retu
ad80: 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a  rn pColl;.}.../*
ad90: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
ada0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72  e that will incr
adb0: 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61  ement the schema
adc0: 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54   cookie..**.** T
add0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
ade0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
adf0: 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73  rmine when the s
ae00: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a  chema for the.**
ae10: 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
ae20: 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73  s.  After each s
ae30: 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68  chema change, th
ae40: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a  e cookie value.*
ae50: 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e  * changes.  When
ae60: 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74   a process first
ae70: 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d   reads the schem
ae80: 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65  a it records the
ae90: 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65  .** cookie.  The
aea0: 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65  reafter, wheneve
aeb0: 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63  r it goes to acc
aec0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
aed0: 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74  ,.** it checks t
aee0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b  he cookie to mak
aef0: 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d  e sure the schem
af00: 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65  a has not change
af10: 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61  d.** since it wa
af20: 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a  s last read..**.
af30: 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20  ** This plan is 
af40: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62  not completely b
af50: 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74  ullet-proof.  It
af60: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
af70: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74  .** the schema t
af80: 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c  o change multipl
af90: 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20  e times and for 
afa0: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65  the cookie to be
afb0: 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20  .** set back to 
afc0: 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75  prior value.  Bu
afd0: 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  t schema changes
afe0: 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a   are infrequent.
aff0: 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61  ** and the proba
b000: 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e  bility of hittin
b010: 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69  g the same cooki
b020: 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a  e value is only.
b030: 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32  ** 1 chance in 2
b040: 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73  ^32.  So we're s
b050: 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76  afe enough..*/.v
b060: 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67  oid sqlite3Chang
b070: 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70  eCookie(Parse *p
b080: 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
b090: 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69  .  int r1 = sqli
b0a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
b0b0: 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
b0c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b0d0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
b0e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
b0f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
b100: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
b110: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
b120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b130: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
b140: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
b150: 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
b160: 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73  okie+1, r1);.  s
b170: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b180: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
b190: 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48  , iDb, BTREE_SCH
b1a0: 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29  EMA_VERSION, r1)
b1b0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
b1c0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
b1d0: 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
b1e0: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
b1f0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
b200: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
b210: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
b220: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
b230: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
b240: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
b250: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
b260: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
b270: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
b280: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
b290: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
b2a0: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
b2b0: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
b2c0: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
b2d0: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
b2e0: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
b2f0: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
b300: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
b310: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
b320: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
b330: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
b340: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
b350: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
b360: 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
b370: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
b380: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62  r to an output b
b390: 75 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e  uffer. The secon
b3a0: 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  d .** parameter 
b3b0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
b3c0: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
b3d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66  contains the off
b3e0: 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20  set at.** which 
b3f0: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
b400: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
b410: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
b420: 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c  opies the.** nul
b430: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
b440: 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ng pointed to by
b450: 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d   the third param
b460: 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65  eter, zSignedIde
b470: 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70  nt,.** to the sp
b480: 65 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69  ecified offset i
b490: 6e 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64  n the buffer and
b4a0: 20 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74   updates *pIdx t
b4b0: 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68  o refer.** to th
b4c0: 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  e first byte aft
b4d0: 65 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  er the last byte
b4e0: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
b4f0: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a  returning..** .*
b500: 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20  * If the string 
b510: 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e  zSignedIdent con
b520: 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
b530: 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a  f alpha-numeric.
b540: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64  ** characters, d
b550: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
b560: 74 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69  th a digit and i
b570: 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79  s not an SQL key
b580: 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  word,.** then it
b590: 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68   is copied to th
b5a0: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
b5b0: 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73  exactly as it is
b5c0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
b5d0: 69 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69  it is quoted usi
b5e0: 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ng double-quotes
b5f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b600: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
b610: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
b620: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
b630: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
b640: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
b650: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
b660: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
b670: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
b680: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a  ;.  i = *pIdx;..
b690: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
b6a0: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
b6b0: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c  if( !sqlite3Isal
b6c0: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
b6d0: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
b6e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
b6f0: 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69  needQuote = sqli
b700: 74 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e  te3Isdigit(zIden
b710: 74 5b 30 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33  t[0]) || sqlite3
b720: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
b730: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
b740: 20 69 66 28 20 21 6e 65 65 64 51 75 6f 74 65 20   if( !needQuote 
b750: 29 7b 0a 20 20 20 20 6e 65 65 64 51 75 6f 74 65  ){.    needQuote
b760: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
b770: 7d 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  }..  if( needQuo
b780: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
b790: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
b7a0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
b7b0: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
b7c0: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
b7d0: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
b7e0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
b7f0: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
b800: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
b810: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
b820: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
b830: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
b840: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
b850: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
b860: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
b870: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
b880: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
b890: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
b8a0: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
b8b0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
b8c0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
b8d0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
b8e0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
b8f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
b900: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
b910: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  t(sqlite3 *db, T
b920: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
b930: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
b940: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
b950: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
b960: 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  End;.  Column *p
b970: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
b980: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
b990: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
b9a0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
b9b0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
b9c0: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
b9d0: 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e  me) + 5;.  }.  n
b9e0: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
b9f0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
ba00: 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53   n<50 ){ .    zS
ba10: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
ba20: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
ba30: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
ba40: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
ba50: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
ba60: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
ba70: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
ba80: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
ba90: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
baa0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
bab0: 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66  cRaw(0, n);.  if
bac0: 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( zStmt==0 ){.  
bad0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
bae0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
baf0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
bb00: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20  te3_snprintf(n, 
bb10: 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54  zStmt, "CREATE T
bb20: 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73  ABLE ");.  k = s
bb30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
bb40: 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75  Stmt);.  identPu
bb50: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e  t(zStmt, &k, p->
bb60: 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b  zName);.  zStmt[
bb70: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
bb80: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
bb90: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
bba0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
bbb0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
bbc0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79  har * const azTy
bbd0: 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  pe[] = {.       
bbe0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54   /* SQLITE_AFF_T
bbf0: 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54  EXT    */ " TEXT
bc00: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
bc10: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20  LITE_AFF_NONE   
bc20: 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20   */ "",.        
bc30: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  /* SQLITE_AFF_NU
bc40: 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c  MERIC */ " NUM",
bc50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
bc60: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a  TE_AFF_INTEGER *
bc70: 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20  / " INT",.      
bc80: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
bc90: 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41  REAL    */ " REA
bca0: 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  L".    };.    in
bcb0: 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  t len;.    const
bcc0: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20   char *zType;.. 
bcd0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
bce0: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
bcf0: 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b  k], zSep);.    k
bd00: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
bd10: 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a  n30(&zStmt[k]);.
bd20: 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32      zSep = zSep2
bd30: 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a  ;.    identPut(z
bd40: 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e  Stmt, &k, pCol->
bd50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65  zName);.    asse
bd60: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
bd70: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  ty-SQLITE_AFF_TE
bd80: 58 54 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61  XT >= 0 );.    a
bd90: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
bda0: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
bdb0: 5f 54 45 58 54 20 3c 20 41 72 72 61 79 53 69 7a  _TEXT < ArraySiz
bdc0: 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20  e(azType) );.   
bdd0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
bde0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
bdf0: 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20  E_AFF_TEXT );.  
be00: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
be10: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
be20: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20  TE_AFF_NONE );. 
be30: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
be40: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
be50: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
be60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
be70: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
be80: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
be90: 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63  GER );.    testc
bea0: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
beb0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
bec0: 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20  REAL );.    .   
bed0: 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b   zType = azType[
bee0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d  pCol->affinity -
bef0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
bf00: 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c  ];.    len = sql
bf10: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
bf20: 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
bf30: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
bf40: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
bf50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
bf60: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
bf70: 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79  =sqlite3Affinity
bf80: 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29  Type(zType, 0) )
bf90: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53  ;.    memcpy(&zS
bfa0: 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c  tmt[k], zType, l
bfb0: 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65  en);.    k += le
bfc0: 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b  n;.    assert( k
bfd0: 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  <=n );.  }.  sql
bfe0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
bff0: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
c000: 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  s", zEnd);.  ret
c010: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
c020: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
c030: 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68   total row width
c040: 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f   for a table..*/
c050: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
c060: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
c070: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
c080: 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20  unsigned wTable 
c090: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  = 0;.  const Col
c0a0: 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
c0b0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
c0c0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43  Tab->nCol, pTabC
c0d0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
c0e0: 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c  >0; i--, pTabCol
c0f0: 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20  ++){.    wTable 
c100: 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73  += pTabCol->szEs
c110: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  t;.  }.  if( pTa
c120: 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61  b->iPKey<0 ) wTa
c130: 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73  ble++;.  pTab->s
c140: 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65  zTabRow = sqlite
c150: 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34  3LogEst(wTable*4
c160: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  );.}../*.** Esti
c170: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
c180: 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66   size of a row f
c190: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  or an index..*/.
c1a0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
c1b0: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49  mateIndexWidth(I
c1c0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
c1d0: 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d  nsigned wIndex =
c1e0: 20 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   1;.  int i;.  c
c1f0: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  onst Column *aCo
c200: 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  l = pIdx->pTable
c210: 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d  ->aCol;.  for(i=
c220: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
c230: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
c240: 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
c250: 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 70 49  lumn[i]>=0 && pI
c260: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c  dx->aiColumn[i]<
c270: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43  pIdx->pTable->nC
c280: 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78  ol );.    wIndex
c290: 20 2b 3d 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61   += aCol[pIdx->a
c2a0: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73  iColumn[i]].szEs
c2b0: 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73  t;.  }.  pIdx->s
c2c0: 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65  zIdxRow = sqlite
c2d0: 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34  3LogEst(wIndex*4
c2e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
c2f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
c300: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
c310: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
c320: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
c330: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
c340: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
c350: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
c360: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
c370: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
c380: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
c390: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
c3a0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
c3b0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
c3c0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
c3d0: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
c3e0: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
c3f0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
c400: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
c410: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
c420: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
c430: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
c440: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
c450: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
c460: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
c470: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
c480: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
c490: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
c4a0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
c4b0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
c4c0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
c4d0: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
c4e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
c4f0: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
c500: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
c510: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
c520: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
c530: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
c540: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
c550: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
c560: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
c570: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
c580: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
c590: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
c5a0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
c5b0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
c5c0: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
c5d0: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
c5e0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
c5f0: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
c600: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
c610: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
c620: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
c630: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
c640: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
c650: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
c660: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
c670: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
c680: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
c690: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c6a0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
c6b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
c6c0: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
c6d0: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
c6e0: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
c6f0: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
c700: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
c710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c720: 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65  e final ')' toke
c730: 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  n in the CREATE 
c740: 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63  TABLE */.  Selec
c750: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
c760: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
c770: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
c780: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
c790: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20  .  Table *p;    
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7b0: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  The new table */
c7c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c7d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
c7e0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
c7f0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
c800: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
c810: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
c820: 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  se in which the 
c830: 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20  table lives */. 
c840: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
c850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
c860: 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f   implied index o
c870: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
c880: 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65   unsigned wTable
c890: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73  ;          /* Es
c8a0: 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65 20  timated average 
c8b0: 77 69 64 74 68 20 6f 66 20 61 20 72 6f 77 20 69  width of a row i
c8c0: 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  n the table */..
c8d0: 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26    if( (pEnd==0 &
c8e0: 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c  & pSelect==0) ||
c8f0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c900: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
c910: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
c920: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
c930: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c940: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
c950: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
c960: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
c970: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
c980: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
c990: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
c9a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c9b0: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
c9c0: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
c9d0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
c9e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
c9f0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
ca00: 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
ca10: 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
ca20: 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c  rence(pParse, p,
ca30: 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20   NC_IsCheck, 0, 
ca40: 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a  p->pCheck);.  }.
ca50: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
ca60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
ca70: 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45  HECK) */..  /* E
ca80: 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72  stimate the aver
ca90: 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72  age row size for
caa0: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66   the table and f
cab0: 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69  or all implied i
cac0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69  ndices */.  esti
cad0: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 70  mateTableWidth(p
cae0: 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  );.  for(pIdx=p-
caf0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
cb00: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
cb10: 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e  {.    estimateIn
cb20: 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a  dexWidth(pIdx);.
cb30: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
cb40: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
cb50: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
cb60: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
cb70: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
cb80: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
cb90: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
cba0: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
cbb0: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
cbc0: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
cbd0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
cbe0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
cbf0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
cc00: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
cc10: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
cc20: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
cc30: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
cc40: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
cc50: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
cc60: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
cc70: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
cc80: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
cc90: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
cca0: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
ccb0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
ccc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
ccd0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
cce0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
ccf0: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
cd00: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
cd10: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
cd20: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
cd30: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
cd40: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
cd50: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
cd60: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
cd70: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
cd80: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
cd90: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
cda0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
cdb0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
cdc0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
cdd0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
cde0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
cdf0: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
ce00: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
ce10: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
ce20: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
ce30: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
ce40: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
ce50: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
ce60: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
ce70: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
ce80: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
ce90: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
cea0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ceb0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
cec0: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
ced0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cee0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
cef0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
cf00: 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
cf10: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
cf20: 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
cf30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
cf40: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
cf50: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
cf60: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
cf70: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
cf80: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
cf90: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
cfa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cfb0: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
cfc0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
cfd0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
cfe0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
cff0: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
d000: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
d010: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
d020: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
d030: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
d040: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
d050: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
d060: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
d070: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
d080: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
d090: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
d0a0: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
d0b0: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
d0c0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
d0d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
d0e0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
d0f0: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
d100: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
d110: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
d120: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
d130: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
d140: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
d150: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
d160: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
d170: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
d180: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
d190: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
d1a0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
d1b0: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
d1c0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
d1d0: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
d1e0: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
d1f0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
d200: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
d210: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
d220: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
d230: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
d240: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
d250: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
d260: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
d270: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
d280: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
d290: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
d2a0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
d2b0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
d2c0: 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Tab;..      asse
d2d0: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
d2e0: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
d2f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d300: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
d310: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
d320: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
d330: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d340: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
d350: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
d360: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
d370: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d380: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
d390: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
d3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
d3b0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
d3c0: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
d3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d3e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
d3f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
d400: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
d410: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
d420: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
d430: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
d440: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
d450: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
d460: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
d470: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d480: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
d490: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
d4a0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
d4b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
d4c0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
d4d0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
d4e0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
d4f0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
d500: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
d510: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
d520: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
d530: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
d540: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
d550: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
d560: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
d570: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
d580: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
d590: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
d5a0: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
d5b0: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
d5c0: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
d5d0: 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  End->z - pParse-
d5e0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b  >sNameToken.z) +
d5f0: 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   1;.      zStmt 
d600: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
d610: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
d620: 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
d630: 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
d640: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
d650: 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
d660: 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
d670: 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
d680: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
d690: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
d6a0: 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
d6b0: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
d6c0: 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
d6d0: 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
d6e0: 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
d6f0: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
d700: 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
d710: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
d720: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
d730: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
d740: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
d750: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
d760: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
d770: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
d780: 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
d790: 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
d7a0: 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
d7b0: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
d7c0: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
d7d0: 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
d7e0: 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
d7f0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
d800: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
d810: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
d820: 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
d830: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
d840: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
d850: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
d860: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
d870: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
d880: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
d890: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d8a0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
d8b0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
d8c0: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
d8d0: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
d8e0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
d8f0: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
d900: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
d910: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
d920: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d930: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54   p->tabFlags & T
d940: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
d950: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
d960: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
d970: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d980: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
d990: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
d9a0: 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
d9b0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
d9c0: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
d9d0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
d9e0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
d9f0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
da00: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
da10: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
da20: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
da30: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
da40: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
da50: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
da60: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
da70: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
da80: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
da90: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
daa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dab0: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
dac0: 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
dad0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
dae0: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
daf0: 61 6d 65 3d 27 25 71 27 22 2c 20 70 2d 3e 7a 4e  ame='%q'", p->zN
db00: 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ame));.  }...  /
db10: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
db20: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
db30: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
db40: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
db50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
db60: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
db70: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
db80: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
db90: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
dba0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
dbb0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
dbc0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
dbd0: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
dbe0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
dbf0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
dc00: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dc30: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d  Strlen30(p->zNam
dc40: 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e),p);.    if( p
dc50: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
dc60: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
dc70: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
dc80: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
dc90: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
dca0: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
dcb0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
dcc0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
dcd0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
dce0: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
dcf0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
dd00: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
dd10: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
dd20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
dd30: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
dd40: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
dd50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
dd60: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
dd70: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
dd80: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
dd90: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
dda0: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
ddb0: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
ddc0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
ddd0: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
dde0: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
ddf0: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
de00: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
de10: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
de20: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
de30: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
de40: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
de50: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
de60: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
de70: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
de80: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
de90: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
dea0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
deb0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
dec0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
ded0: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
dee0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
def0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
df00: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
df10: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
df20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
df30: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
df40: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
df50: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
df60: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
df70: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
df80: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
df90: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
dfa0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
dfb0: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
dfc0: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
dfd0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
dfe0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
dff0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
e000: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
e010: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
e020: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
e030: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
e040: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
e050: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
e060: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
e070: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
e080: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
e090: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
e0a0: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
e0b0: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
e0c0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
e0d0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
e0e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
e0f0: 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
e100: 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
e110: 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a  ken *pName = 0;.
e120: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
e130: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e140: 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
e150: 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
e160: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e170: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
e180: 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
e190: 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
e1a0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
e1b0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
e1c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
e1d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
e1e0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
e1f0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
e200: 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
e210: 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
e220: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
e230: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
e240: 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
e250: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
e260: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
e270: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
e280: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
e290: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
e2a0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
e2b0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
e2c0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
e2d0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
e2e0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  p->pSchema);.  s
e2f0: 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
e300: 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
e310: 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
e320: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
e330: 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
e340: 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
e350: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
e360: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
e370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
e380: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  }..  /* Make a c
e390: 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
e3a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
e3b0: 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
e3c0: 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
e3d0: 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
e3e0: 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
e3f0: 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
e400: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
e410: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
e420: 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
e430: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
e440: 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
e450: 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
e460: 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
e470: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
e480: 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
e490: 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
e4a0: 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
e4b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
e4c0: 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50  db, pSelect, EXP
e4d0: 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
e4e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
e4f0: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
e500: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
e510: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e520: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
e530: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
e540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
e550: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
e560: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
e570: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
e580: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
e590: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
e5a0: 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
e5b0: 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
e5c0: 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
e5d0: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
e5e0: 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41  stToken;.  if( A
e5f0: 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21  LWAYS(sEnd.z[0]!
e600: 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  =0) && sEnd.z[0]
e610: 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
e620: 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
e630: 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
e640: 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e  .  n = (int)(sEn
e650: 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29  d.z - pBegin->z)
e660: 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
e670: 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c 57 41  z;.  while( ALWA
e680: 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c 69 74  YS(n>0) && sqlit
e690: 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
e6a0: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
e6b0: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
e6c0: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
e6d0: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
e6e0: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
e6f0: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
e700: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
e710: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
e720: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
e730: 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  , 0, &sEnd, 0);.
e740: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
e750: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e760: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
e770: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e780: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
e790: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e7a0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
e7b0: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
e7c0: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
e7d0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
e7e0: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
e7f0: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
e800: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
e810: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
e820: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
e830: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
e840: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
e850: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
e860: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
e870: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
e880: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
e890: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
e8a0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
e8b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
e8c0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
e8d0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
e8e0: 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
e8f0: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
e900: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
e910: 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
e920: 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
e930: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
e940: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
e950: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
e960: 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
e970: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
e980: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
e990: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
e9a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
e9b0: 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
e9c0: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
e9d0: 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
e9e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e9f0: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
ea00: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ea10: 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
ea20: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ors */.  int (*x
ea30: 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Auth)(void*,int,
ea40: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
ea50: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
ea60: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
ea70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
ea80: 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
ea90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
eaa0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73  UALTABLE.  if( s
eab0: 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
eac0: 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
ead0: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
eae0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
eaf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
eb00: 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
eb10: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
eb20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
eb30: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
eb40: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
eb50: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
eb60: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
eb70: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
eb80: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
eb90: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
eba0: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
ebb0: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
ebc0: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
ebd0: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
ebe0: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
ebf0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
ec00: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
ec10: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
ec20: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
ec30: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
ec40: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
ec50: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
ec60: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
ec70: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
ec80: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
ec90: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
eca0: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
ecb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
ecc0: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
ecd0: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
ece0: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
ecf0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
ed00: 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62  ly, the error ab
ed10: 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ove is now caugh
ed20: 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
ed30: 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a  ing this point..
ed40: 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c    ** But the fol
ed50: 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73  lowing test is s
ed60: 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61  till important a
ed70: 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75  s it does come u
ed80: 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f  p.  ** in the fo
ed90: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20  llowing:.  ** . 
eda0: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
edb0: 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29  ABLE main.ex1(a)
edc0: 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
edd0: 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20  E TEMP VIEW ex1 
ede0: 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
edf0: 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53   ex1;.  **     S
ee00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d  ELECT * FROM tem
ee10: 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66  p.ex1;.  */.  if
ee20: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
ee30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ee40: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ee50: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
ee60: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
ee70: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
ee80: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
ee90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
eea0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
eeb0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
eec0: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
eed0: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
eee0: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
eef0: 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
ef00: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
ef10: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
ef20: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
ef30: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
ef40: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
ef50: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
ef60: 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
ef70: 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
ef80: 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
ef90: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
efa0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
efb0: 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
efc0: 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
efd0: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
efe0: 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
eff0: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
f000: 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
f010: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
f020: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
f030: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
f040: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
f050: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
f060: 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
f070: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
f080: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
f090: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
f0a0: 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c   ){.    u8 enabl
f0b0: 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d  eLookaside = db-
f0c0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
f0d0: 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61  led;.    n = pPa
f0e0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
f0f0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
f100: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
f110: 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
f120: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
f130: 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c   = -1;.    db->l
f140: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
f150: 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  d = 0;.#ifndef S
f160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
f170: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75  RIZATION.    xAu
f180: 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a  th = db->xAuth;.
f190: 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
f1a0: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  0;.    pSelTab =
f1b0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
f1c0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
f1d0: 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d  , pSel);.    db-
f1e0: 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a  >xAuth = xAuth;.
f1f0: 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61  #else.    pSelTa
f200: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
f210: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
f220: 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64  rse, pSel);.#end
f230: 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  if.    db->looka
f240: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
f250: 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b  enableLookaside;
f260: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
f270: 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
f280: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
f290: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
f2a0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
f2b0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
f2c0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
f2d0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
f2e0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
f2f0: 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
f300: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
f310: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
f320: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
f330: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
f340: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
f350: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f360: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
f370: 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e  (db, 0, pTable->
f380: 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
f390: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
f3a0: 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55  a->flags |= DB_U
f3b0: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20  nresetViews;.   
f3c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
f3d0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
f3e0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
f3f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
f400: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
f410: 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20  pSel);.  } else 
f420: 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  {.    nErr++;.  
f430: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f440: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
f450: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
f460: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
f470: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f480: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
f490: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f4a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
f4b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f4c0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
f4d0: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
f4e0: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
f4f0: 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
f500: 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
f510: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
f520: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
f530: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
f540: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
f550: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f560: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
f570: 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b  d(db, idx, 0) );
f580: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
f590: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
f5a0: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
f5b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
f5c0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
f5d0: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
f5e0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
f5f0: 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
f600: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
f610: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
f620: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
f630: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
f640: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
f650: 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d  qliteDeleteColum
f660: 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29  nNames(db, pTab)
f670: 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43  ;.      pTab->aC
f680: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54  ol = 0;.      pT
f690: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
f6a0: 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61    }.  }.  DbClea
f6b0: 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  rProperty(db, id
f6c0: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
f6d0: 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  ws);.}.#else.# d
f6e0: 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77  efine sqliteView
f6f0: 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65  ResetAll(A,B).#e
f700: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f710: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a  MIT_VIEW */../*.
f720: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
f730: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
f740: 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74  e VDBE to adjust
f750: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63   the internal sc
f760: 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20  hema.** used by 
f770: 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20  SQLite when the 
f780: 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65  btree layer move
f790: 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  s a table root p
f7a0: 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74  age. The.** root
f7b0: 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65  -page of a table
f7c0: 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74   or index in dat
f7d0: 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68  abase iDb has ch
f7e0: 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d  anged from iFrom
f7f0: 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a  .** to iTo..**.*
f800: 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20  * Ticket #1728: 
f810: 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   The symbol tabl
f820: 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f  e might still co
f830: 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ntain informatio
f840: 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61  n.** on tables a
f850: 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68  nd/or indices th
f860: 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65  at are the proce
f870: 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65  ss of being dele
f880: 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61  ted..** If you a
f890: 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20  re unlucky, one 
f8a0: 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64  of those deleted
f8b0: 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c   indices or tabl
f8c0: 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65  es might.** have
f8d0: 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61   the same rootpa
f8e0: 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65  ge number as the
f8f0: 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69   real table or i
f900: 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20  ndex that is.** 
f910: 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f  being moved.  So
f920: 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20   we cannot stop 
f930: 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20  searching after 
f940: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
f950: 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20  .** because the 
f960: 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68  first match migh
f970: 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  t be for one of 
f980: 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  the deleted indi
f990: 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73  ces.** or tables
f9a0: 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62   and not the tab
f9b0: 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73  le/index that is
f9c0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
f9d0: 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73  moved..** We mus
f9e0: 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69  t continue loopi
f9f0: 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62  ng until all tab
fa00: 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20  les and indices 
fa10: 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65  with.** rootpage
fa20: 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65  ==iFrom have bee
fa30: 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68  n converted to h
fa40: 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f  ave a rootpage o
fa50: 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65  f iTo.** in orde
fa60: 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20  r to be certain 
fa70: 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20  that we got the 
fa80: 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69  right one..*/.#i
fa90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
faa0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69  T_AUTOVACUUM.voi
fab0: 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67  d sqlite3RootPag
fac0: 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a  eMoved(sqlite3 *
fad0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
fae0: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
faf0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
fb00: 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
fb10: 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  sh;.  Db *pDb;..
fb20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fb30: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
fb40: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
fb50: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
fb60: 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d  [iDb];.  pHash =
fb70: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
fb80: 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
fb90: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
fba0: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
fbb0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
fbc0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
fbd0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
fbe0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
fbf0: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
fc00: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
fc10: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
fc20: 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
fc30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
fc40: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
fc50: 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
fc60: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
fc70: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
fc80: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
fc90: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
fca0: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
fcb0: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
fcc0: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
fcd0: 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
fce0: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
fcf0: 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
fd00: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
fd10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
fd20: 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
fd30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
fd40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
fd50: 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
fd60: 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
fd70: 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
fd80: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
fd90: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
fda0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
fdb0: 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
fdc0: 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
fdd0: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
fde0: 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
fdf0: 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
fe00: 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
fe10: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
fe20: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
fe30: 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
fe40: 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
fe50: 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
fe60: 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
fe70: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
fe80: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
fe90: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
fea0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
feb0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
fec0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
fed0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
fee0: 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
fef0: 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  1, iDb);.  sqlit
ff00: 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
ff10: 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
ff20: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ff30: 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
ff40: 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20  oy stores an in 
ff50: 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74  integer r1. If t
ff60: 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
ff70: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
ff80: 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
ff90: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
ffa0: 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
ffb0: 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
ffc0: 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
ffd0: 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
ffe0: 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
fff0: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
10000 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
10010 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
10020 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51  "#NNN" in the SQ
10030 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
10040 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
10050 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
10060 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67  e.  ** is in reg
10070 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20  ister NNN.  See 
10080 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73  grammar rules as
10090 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
100a0 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  e TK_REGISTER.  
100b0 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64  ** token for add
100c0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
100d0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ion..  */.  sqli
100e0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
100f0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50  Parse, .     "UP
10100 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72  DATE %Q.%s SET r
10110 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45  ootpage=%d WHERE
10120 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67   #%d AND rootpag
10130 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61  e=#%d",.     pPa
10140 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
10150 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
10160 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62  TABLE(iDb), iTab
10170 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e  le, r1, r1);.#en
10180 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  dif.  sqlite3Rel
10190 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
101a0 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
101b0 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64  * Write VDBE cod
101c0 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65  e to erase table
101d0 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73   pTab and all as
101e0 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73  sociated indices
101f0 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64   on disk..** Cod
10200 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
10210 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
10220 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61  bles and interna
10230 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74  l schema definit
10240 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20  ions.** in case 
10250 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f  a root-page belo
10260 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72  nging to another
10270 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
10280 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  by the btree lay
10290 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64  er.** is also ad
102a0 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61  ded (this can ha
102b0 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
102c0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
102d0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e)..*/.static vo
102e0 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28  id destroyTable(
102f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
10300 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66  able *pTab){.#if
10310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10320 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64  AUTOVACUUM.  Ind
10330 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20  ex *pIdx;.  int 
10340 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
10350 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
10360 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
10370 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79  hema);.  destroy
10380 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
10390 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62   pTab->tnum, iDb
103a0 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  );.  for(pIdx=pT
103b0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
103c0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
103d0 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  xt){.    destroy
103e0 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
103f0 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
10400 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f  );.  }.#else.  /
10410 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
10420 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61  e may be auto-va
10430 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66  cuum capable (if
10440 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
10450 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20  OVACUUM.  ** is 
10460 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68  not defined), th
10470 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  en it is importa
10480 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65  nt to call OP_De
10490 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a  stroy on the.  *
104a0 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  * table and inde
104b0 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20  x root-pages in 
104c0 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20  order, starting 
104d0 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63  with the numeric
104e0 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65  ally .  ** large
104f0 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
10500 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e  ber. This guaran
10510 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f  tees that none o
10520 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73  f the root-pages
10530 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74  .  ** to be dest
10540 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74  royed is relocat
10550 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
10560 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65   OP_Destroy. i.e
10570 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f  . if the.  ** fo
10580 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64  llowing were cod
10590 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50  ed:.  **.  ** OP
105a0 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a  _Destroy 4 0.  *
105b0 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65  * ....  ** OP_De
105c0 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20  stroy 5 0.  **. 
105d0 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67   ** and root pag
105e0 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20  e 5 happened to 
105f0 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  be the largest r
10600 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20  oot-page number 
10610 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
10620 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20  base, then root 
10630 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20  page 5 would be 
10640 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20  moved to page 4 
10650 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50  by the .  ** "OP
10660 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70  _Destroy 4 0" op
10670 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71  code. The subseq
10680 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79  uent "OP_Destroy
10690 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a   5 0" would hit.
106a0 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74    ** a free-list
106b0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e   page..  */.  in
106c0 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74  t iTab = pTab->t
106d0 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74  num;.  int iDest
106e0 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68  royed = 0;..  wh
106f0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e  ile( 1 ){.    In
10700 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69  dex *pIdx;.    i
10710 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b  nt iLargest = 0;
10720 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72  ..    if( iDestr
10730 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c  oyed==0 || iTab<
10740 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20  iDestroyed ){.  
10750 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
10760 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Tab;.    }.    f
10770 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
10780 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
10790 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
107a0 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20       int iIdx = 
107b0 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  pIdx->tnum;.    
107c0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
107d0 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
107e0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
107f0 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d  if( (iDestroyed=
10800 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73  =0 || (iIdx<iDes
10810 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78  troyed)) && iIdx
10820 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20  >iLargest ){.   
10830 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
10840 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iIdx;.      }.  
10850 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72    }.    if( iLar
10860 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gest==0 ){.     
10870 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c   return;.    }el
10880 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44  se{.      int iD
10890 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
108a0 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
108b0 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
108c0 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ma);.      asser
108d0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
108e0 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
108f0 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f   );.      destro
10900 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
10910 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29  , iLargest, iDb)
10920 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79  ;.      iDestroy
10930 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20  ed = iLargest;. 
10940 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
10950 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
10960 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65  entries from the
10970 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61   sqlite_statN ta
10980 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28  bles (for N in (
10990 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72  1,2,3)).** after
109a0 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72   a DROP INDEX or
109b0 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d   DROP TABLE comm
109c0 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  and..*/.static v
109d0 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72  oid sqlite3Clear
109e0 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61  StatTables(.  Pa
109f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10a00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10a10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10a20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20   int iDb,       
10a30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
10a40 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
10a50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10a60 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69  zType,     /* "i
10a70 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a  dx" or "tbl" */.
10a80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10a90 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame      /* Name
10aa0 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62   of index or tab
10ab0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  le */.){.  int i
10ac0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10ad0 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65  zDbName = pParse
10ae0 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
10af0 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Name;.  for(i=1;
10b00 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=4; i++){.   
10b10 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a   char zTab[24];.
10b20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10b30 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62  intf(sizeof(zTab
10b40 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73  ),zTab,"sqlite_s
10b50 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69  tat%d",i);.    i
10b60 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  f( sqlite3FindTa
10b70 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
10b80 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29  zTab, zDbName) )
10b90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
10ba0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10bb0 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
10bc0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
10bd0 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20  ERE %s=%Q",.    
10be0 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
10bf0 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a  b, zType, zName.
10c00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
10c10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
10c20 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f  rate code to dro
10c30 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  p a table..*/.vo
10c40 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72  id sqlite3CodeDr
10c50 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
10c60 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
10c70 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  ab, int iDb, int
10c80 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65   isView){.  Vdbe
10c90 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
10ca0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10cb0 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69  .  Trigger *pTri
10cc0 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20  gger;.  Db *pDb 
10cd0 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
10ce0 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
10cf0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10d00 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
10d10 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
10d20 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
10d30 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
10d40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10d50 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
10d60 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
10d70 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
10d80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
10d90 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
10da0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
10db0 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65   Drop all trigge
10dc0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
10dd0 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  th the table bei
10de0 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65  ng dropped. Code
10df0 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74  .  ** is generat
10e00 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74  ed to remove ent
10e10 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  ries from sqlite
10e20 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20  _master and/or. 
10e30 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   ** sqlite_temp_
10e40 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72  master if requir
10e50 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67  ed..  */.  pTrig
10e60 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69  ger = sqlite3Tri
10e70 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ggerList(pParse,
10e80 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28   pTab);.  while(
10e90 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20   pTrigger ){.   
10ea0 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
10eb0 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  r->pSchema==pTab
10ec0 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20  ->pSchema || .  
10ed0 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e        pTrigger->
10ee0 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
10ef0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
10f00 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72     sqlite3DropTr
10f10 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c  iggerPtr(pParse,
10f20 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20   pTrigger);.    
10f30 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67  pTrigger = pTrig
10f40 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ger->pNext;.  }.
10f50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10f60 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
10f70 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  NT.  /* Remove a
10f80 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68  ny entries of th
10f90 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
10fa0 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  e table associat
10fb0 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
10fc0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
10fd0 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f  pped. This is do
10fe0 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61  ne before the ta
10ff0 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20  ble is dropped. 
11000 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65   ** at the btree
11010 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20   level, in case 
11020 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
11030 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20  nce table needs 
11040 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20  to.  ** move as 
11050 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
11060 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e  drop (can happen
11070 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
11080 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  mode)..  */.  if
11090 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
110a0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
110b0 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
110c0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
110d0 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c  arse,.      "DEL
110e0 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69  ETE FROM %Q.sqli
110f0 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52  te_sequence WHER
11100 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
11110 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54    pDb->zName, pT
11120 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ab->zName.    );
11130 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
11140 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
11150 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61  E_MASTER table a
11160 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
11170 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
11180 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  he.  ** table. T
11190 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
111a0 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
111b0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
111c0 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20  nd deletes.  ** 
111d0 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
111e0 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
111f0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
11200 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
11210 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e  ng.  ** dropped.
11220 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61   Triggers are ha
11230 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
11240 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67   because a trigg
11250 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63  er can be.  ** c
11260 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
11270 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
11280 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
11290 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
112a0 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ** database..  *
112b0 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
112c0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
112d0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
112e0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74  OM %Q.%s WHERE t
112f0 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74  bl_name=%Q and t
11300 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c  ype!='trigger'",
11310 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
11320 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
11330 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  iDb), pTab->zNam
11340 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65  e);.  if( !isVie
11350 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  w && !IsVirtual(
11360 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73  pTab) ){.    des
11370 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65  troyTable(pParse
11380 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20  , pTab);.  }..  
11390 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61  /* Remove the ta
113a0 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53  ble entry from S
113b0 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c  QLite's internal
113c0 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69   schema and modi
113d0 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65  fy.  ** the sche
113e0 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a  ma cookie..  */.
113f0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
11400 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
11410 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
11420 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69  , OP_VDestroy, i
11430 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
11440 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  zName, 0);.  }. 
11450 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11460 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62  p4(v, OP_DropTab
11470 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  le, iDb, 0, 0, p
11480 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
11490 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
114a0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
114b0 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77  b);.  sqliteView
114c0 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62  ResetAll(db, iDb
114d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
114e0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
114f0 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
11500 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c  k of a DROP TABL
11510 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  E statement..** 
11520 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  pName is the nam
11530 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
11540 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f  o be dropped..*/
11550 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
11560 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
11570 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
11580 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77  Name, int isView
11590 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20  , int noErr){.  
115a0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56  Table *pTab;.  V
115b0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
115c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
115d0 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
115e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
115f0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
11600 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
11610 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  le;.  }.  assert
11620 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
11630 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11640 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
11650 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
11660 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b  b->suppressErr++
11670 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
11680 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
11690 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77  m(pParse, isView
116a0 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  , &pName->a[0]);
116b0 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
116c0 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d  b->suppressErr--
116d0 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  ;..  if( pTab==0
116e0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72   ){.    if( noEr
116f0 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56  r ) sqlite3CodeV
11700 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
11710 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
11720 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
11730 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
11740 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
11750 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
11760 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
11770 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
11780 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
11790 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
117a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62  );..  /* If pTab
117b0 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61   is a virtual ta
117c0 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65  ble, call ViewGe
117d0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74  tColumnNames() t
117e0 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74  o ensure.  ** it
117f0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
11800 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
11810 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 73  rtual(pTab) && s
11820 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
11830 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
11840 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f   pTab) ){.    go
11850 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
11860 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  le;.  }.#ifndef 
11870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
11880 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
11890 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
118a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
118b0 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
118c0 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  iDb);.    const 
118d0 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
118e0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
118f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11900 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69  zArg2 = 0;.    i
11910 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
11920 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
11930 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
11940 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20   0, zDb)){.     
11950 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
11960 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
11970 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
11980 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
11990 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
119a0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
119b0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
119c0 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
119d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
119e0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
119f0 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23  _VIEW;.      }.#
11a00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11a10 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
11a20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
11a30 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
11a40 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51  .      code = SQ
11a50 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45  LITE_DROP_VTABLE
11a60 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20  ;.      zArg2 = 
11a70 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
11a80 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64  (db, pTab)->pMod
11a90 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
11aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11ab0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
11ac0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
11ad0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
11ae0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
11af0 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
11b00 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
11b10 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
11b20 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
11b30 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
11b40 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
11b50 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
11b60 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
11b70 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
11b80 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
11b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11ba0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
11bb0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
11bc0 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
11bd0 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
11be0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
11bf0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
11c00 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
11c10 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
11c20 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
11c30 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
11c40 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33   .    && sqlite3
11c50 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
11c60 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74  Name, "sqlite_st
11c70 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20  at", 11)!=0 ){. 
11c80 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11c90 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
11ca0 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
11cb0 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e  dropped", pTab->
11cc0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
11cd0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
11ce0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
11cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
11d00 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50    /* Ensure DROP
11d10 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73   TABLE is not us
11d20 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e  ed on a view, an
11d30 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e  d DROP VIEW is n
11d40 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20  ot used.  ** on 
11d50 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  a table..  */.  
11d60 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70 54  if( isView && pT
11d70 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
11d80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11d90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
11da0 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f  se DROP TABLE to
11db0 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73   delete table %s
11dc0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
11dd0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
11de0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
11df0 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
11e00 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
11e10 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11e20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73  rMsg(pParse, "us
11e30 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64  e DROP VIEW to d
11e40 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c 20  elete view %s", 
11e50 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
11e60 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
11e70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
11e80 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
11e90 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
11ea0 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
11eb0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
11ec0 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20  .  ** on disk.. 
11ed0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
11ee0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11ef0 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
11f00 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
11f10 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
11f20 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
11f30 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
11f40 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
11f50 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62  iDb, "tbl", pTab
11f60 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
11f70 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65  lite3FkDropTable
11f80 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20  (pParse, pName, 
11f90 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
11fa0 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
11fb0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44  pParse, pTab, iD
11fc0 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a  b, isView);.  }.
11fd0 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
11fe0 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
11ff0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
12000 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
12010 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12020 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
12030 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
12040 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
12050 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
12060 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
12070 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
12080 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
12090 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
120a0 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
120b0 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
120c0 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
120d0 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
120e0 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
120f0 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
12100 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
12110 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
12120 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
12130 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69  ed to.  pToCol i
12140 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  s a list of tabl
12150 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a  es in the other.
12160 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61  ** pTo table tha
12170 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
12180 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c  y points to.  fl
12190 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
121a0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
121b0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
121c0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
121d0 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
121e0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
121f0 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
12200 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
12210 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
12220 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
12230 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
12240 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
12250 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
12260 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
12270 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
12280 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
12290 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  d..**.** The for
122a0 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
122b0 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
122c0 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
122d0 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
122e0 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
122f0 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
12300 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
12310 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
12320 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
12330 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
12340 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
12350 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
12360 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
12370 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
12380 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
12390 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
123a0 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
123b0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
123c0 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
123d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
123e0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
123f0 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
12400 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
12410 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
12420 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
12430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
12440 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
12450 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
12460 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12470 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
12480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12490 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
124a0 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
124b0 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54  ;.  FKey *pNextT
124c0 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  o;.  Table *p = 
124d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
124e0 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
124f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
12500 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
12510 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
12520 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
12530 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
12540 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
12550 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
12560 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
12570 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
12580 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69  .    if( NEVER(i
12590 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b  Col<0) ) goto fk
125a0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
125b0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
125c0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
125d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
125e0 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
125f0 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
12600 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
12610 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
12620 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
12630 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
12640 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
12650 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
12660 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
12670 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
12680 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
12690 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
126a0 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
126b0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
126c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
126d0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
126e0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
126f0 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
12700 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
12710 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
12720 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
12730 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
12740 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
12750 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
12760 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
12770 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
12780 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
12790 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
127a0 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
127b0 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
127c0 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
127d0 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
127e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
127f0 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
12800 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
12810 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12820 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
12830 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
12840 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
12850 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
12860 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
12870 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
12880 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
12890 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
128a0 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
128b0 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
128c0 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
128d0 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
128e0 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
128f0 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
12900 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
12910 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
12920 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
12930 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
12940 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
12950 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
12960 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
12970 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
12980 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
12990 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
129a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
129b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
129c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
129d0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
129e0 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
129f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
12a00 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
12a10 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
12a20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
12a30 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
12a40 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
12a50 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
12a60 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12a70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12a80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
12a90 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
12aa0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12ab0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
12ac0 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
12ad0 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
12ae0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
12af0 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
12b00 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
12b10 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
12b20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
12b30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12b40 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
12b50 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
12b60 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
12b70 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
12b80 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
12b90 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
12ba0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
12bb0 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
12bc0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
12bd0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
12be0 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
12bf0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
12c00 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
12c10 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
12c20 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
12c30 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20  y->aAction[0] = 
12c40 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
12c50 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  f);            /
12c60 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69  * ON DELETE acti
12c70 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61  on */.  pFKey->a
12c80 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29  Action[1] = (u8)
12c90 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26  ((flags >> 8 ) &
12ca0 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e   0xff);    /* ON
12cb0 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a   UPDATE action *
12cc0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
12cd0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
12ce0 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53  eld(db, 0, p->pS
12cf0 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78  chema) );.  pNex
12d00 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71  tTo = (FKey *)sq
12d10 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
12d20 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65  &p->pSchema->fke
12d30 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46  yHash, .      pF
12d40 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74 65  Key->zTo, sqlite
12d50 33 53 74 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d  3Strlen30(pFKey-
12d60 3e 7a 54 6f 29 2c 20 28 76 6f 69 64 20 2a 29 70  >zTo), (void *)p
12d70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20  FKey.  );.  if( 
12d80 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29  pNextTo==pFKey )
12d90 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
12da0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
12db0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
12dc0 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29  .  if( pNextTo )
12dd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
12de0 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d  extTo->pPrevTo==
12df0 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 );.    pFKey->
12e00 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54  pNextTo = pNextT
12e10 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e  o;.    pNextTo->
12e20 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b  pPrevTo = pFKey;
12e30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
12e40 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
12e50 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
12e60 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
12e70 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
12e80 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
12e90 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
12ea0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12eb0 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66  , pFKey);.#endif
12ec0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
12ed0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
12ee0 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74  _KEY) */.  sqlit
12ef0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
12f00 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a  (db, pFromCol);.
12f10 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
12f20 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43  tDelete(db, pToC
12f30 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
12f40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12f50 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
12f60 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
12f70 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
12f80 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
12f90 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
12fa0 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
12fb0 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
12fc0 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
12fd0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
12fe0 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
12ff0 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
13000 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
13010 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
13020 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
13030 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
13040 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
13050 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
13060 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
13070 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
13080 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
13090 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
130a0 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
130b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
130c0 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
130d0 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
130e0 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
130f0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
13100 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
13110 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
13120 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
13130 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65  ;.  assert( isDe
13140 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44  ferred==0 || isD
13150 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a  eferred==1 ); /*
13160 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39   EV: R-30323-219
13170 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69  17 */.  pFKey->i
13180 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29  sDeferred = (u8)
13190 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
131a0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
131b0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
131c0 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
131d0 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
131e0 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
131f0 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
13200 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
13210 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
13220 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
13230 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
13240 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
13250 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
13260 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
13270 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
13280 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
13290 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
132a0 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
132b0 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69  eated.  The regi
132c0 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62  ster specified b
132d0 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
132e0 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
132f0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
13300 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
13310 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
13320 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
13330 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
13340 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
13350 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
13360 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
13370 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
13380 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
13390 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
133a0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
133b0 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
133c0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
133d0 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
133e0 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
133f0 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
13400 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
13410 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
13420 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
13430 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
13440 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
13450 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
13460 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
13470 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
13480 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
13490 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
134a0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
134b0 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
134c0 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
134d0 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72  */.  int iSorter
134e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
134f0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
13500 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74  ened by OpenSort
13510 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a  er (if in use) *
13520 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13550 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
13560 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20    int addr2;    
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a   /* Address to j
13590 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20  ump to for next 
135a0 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  iteration */.  i
135b0 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135d0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
135e0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  dex */.  int iPa
135f0 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20  rtIdxLabel;     
13600 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
13610 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f  to this label to
13620 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20   skip a row */. 
13630 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13660 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
13670 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
13680 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20  KeyInfo *pKey;  
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
136a0 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e  * KeyInfo for in
136b0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  dex */.  int reg
136c0 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
136d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
136e0 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
136f0 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72 65 63  mblied index rec
13700 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
13710 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13720 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
13730 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13740 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
13750 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
13760 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
13770 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
13780 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13790 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
137a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
137b0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
137c0 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
137d0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
137e0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
137f0 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
13800 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
13810 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
13820 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
13830 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
13840 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
13850 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
13860 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
13870 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
13880 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
13890 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
138a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
138b0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
138c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
138d0 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
138e0 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
138f0 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
13900 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
13910 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
13920 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13930 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
13940 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d   tnum, iDb);.  }
13950 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
13960 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
13970 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  arse, pIndex);. 
13980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13990 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p4(v, OP_OpenWri
139a0 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20  te, iIdx, tnum, 
139b0 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iDb, .          
139c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 20            (char 
139d0 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e  *)pKey, P4_KEYIN
139e0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73  FO_HANDOFF);.  s
139f0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13a00 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c  P5(v, OPFLAG_BUL
13a10 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61  KCSR|((memRootPa
13a20 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32  ge>=0)?OPFLAG_P2
13a30 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 2f 2a  ISREG:0));..  /*
13a40 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
13a50 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
13a60 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
13a70 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
13a80 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
13a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13aa0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
13ab0 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 30  n, iSorter, 0, 0
13ac0 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50  , (char*)pKey, P
13ad0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f  4_KEYINFO);..  /
13ae0 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65  * Open the table
13af0 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  . Loop through a
13b00 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
13b10 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20  able, inserting 
13b20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72  index.  ** recor
13b30 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ds into the sort
13b40 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  er. */.  sqlite3
13b50 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
13b60 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
13b70 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
13b80 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
13b90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13ba0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
13bb0 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64   0);.  regRecord
13bc0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
13bd0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20  pReg(pParse);.. 
13be0 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
13bf0 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
13c00 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72   pIndex, iTab, r
13c10 65 67 52 65 63 6f 72 64 2c 20 31 2c 20 26 69 50  egRecord, 1, &iP
13c20 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
13c30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13c40 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e  2(v, OP_SorterIn
13c50 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72  sert, iSorter, r
13c60 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
13c70 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
13c80 61 62 65 6c 28 76 2c 20 69 50 61 72 74 49 64 78  abel(v, iPartIdx
13c90 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  Label);.  sqlite
13ca0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13cb0 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
13cc0 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
13cd0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13ce0 20 61 64 64 72 31 29 3b 0a 20 20 61 64 64 72 31   addr1);.  addr1
13cf0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
13d00 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
13d10 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
13d20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  0);.  if( pIndex
13d30 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
13d40 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32  ne ){.    int j2
13d50 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
13d60 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33  rrentAddr(v) + 3
13d70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13d80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13d90 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20  to, 0, j2);.    
13da0 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
13db0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
13dc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13dd0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
13de0 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
13df0 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
13e00 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  cord);.    sqlit
13e10 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
13e20 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
13e30 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
13e40 45 2c 0a 20 20 20 20 20 20 20 20 4f 45 5f 41 62  E,.        OE_Ab
13e50 6f 72 74 2c 20 22 69 6e 64 65 78 65 64 20 63 6f  ort, "indexed co
13e60 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e  lumns are not un
13e70 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43  ique", P4_STATIC
13e80 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
13e90 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
13ea0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
13eb0 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  ddr(v);.  }.  sq
13ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13ed0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
13ee0 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65  , iSorter, regRe
13ef0 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
13f00 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13f10 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78  _IdxInsert, iIdx
13f20 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b  , regRecord, 1);
13f30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
13f40 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
13f50 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
13f60 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
13f70 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
13f80 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
13f90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13fa0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
13fb0 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72  t, iSorter, addr
13fc0 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
13fd0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
13fe0 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  r1);..  sqlite3V
13ff0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14000 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
14010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14020 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
14030 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
14040 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14050 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b  Close, iSorter);
14060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
14070 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
14080 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
14090 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
140a0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
140b0 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
140c0 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
140d0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
140e0 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
140f0 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
14100 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
14110 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
14120 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
14130 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
14140 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
14150 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
14160 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
14170 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
14180 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
14190 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
141a0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
141b0 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
141c0 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
141d0 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
141e0 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
141f0 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
14200 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
14210 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
14220 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
14230 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
14240 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
14250 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
14260 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
14270 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
14280 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
14290 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
142a0 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
142b0 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
142c0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
142d0 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  truction.  .**.*
142e0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  * If the index i
142f0 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73  s created succes
14300 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61  sfully, return a
14310 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14320 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72  new Index.** str
14330 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20  ucture. This is 
14340 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41  used by sqlite3A
14350 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74  ddPrimaryKey() t
14360 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78  o mark the index
14370 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
14380 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49  s primary key (I
14390 6e 64 65 78 2e 61 75 74 6f 49 6e 64 65 78 3d 3d  ndex.autoIndex==
143a0 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  2)..*/.Index *sq
143b0 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
143c0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
143d0 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
143e0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
143f0 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
14400 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
14410 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
14420 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
14430 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
14440 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
14450 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
14460 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
14470 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
14480 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
14490 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
144a0 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
144b0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
144c0 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
144d0 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
144e0 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
144f0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
14500 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
14510 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
14520 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
14530 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
14540 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
14550 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
14560 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
14570 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
14580 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
14590 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65    Expr *pPIWhere
145a0 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  ,    /* WHERE cl
145b0 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c  ause for partial
145c0 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
145d0 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
145e0 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
145f0 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
14600 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
14610 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
14620 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st     /* Omit e
14630 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
14640 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
14650 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74  ){.  Index *pRet
14660 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69   = 0;     /* Poi
14670 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  nter to return *
14680 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
14690 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
146a0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
146b0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
146c0 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
146d0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
146e0 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
146f0 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
14700 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
14710 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
14720 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
14730 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
14740 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
14750 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
14760 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20  Token nullId;   
14770 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b       /* Fake tok
14780 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
14790 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
147a0 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20  ixer sFix;      
147b0 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
147c0 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
147d0 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
147e0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61   int sortOrderMa
147f0 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f  sk;   /* 1 to ho
14800 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65  nor DESC in inde
14810 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e  x.  0 to ignore.
14820 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
14830 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14840 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
14850 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
14860 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e  ecific table con
14870 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
14880 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  xed database */.
14890 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
148a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
148b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
148c0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
148d0 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
148e0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *pName = 0;    
148f0 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
14900 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
14910 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20   to create */.  
14920 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
14930 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b  item *pListItem;
14940 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
14950 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20  over pList */.  
14960 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54  const Column *pT
14970 61 62 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  abCol;          
14980 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 69 6e 20   /* A column in 
14990 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
149a0 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
149d0 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  umns */.  int nE
149e0 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
149f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
14a00 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
14a10 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20  r zExtra[] */.  
14a20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 20 20 20  char *zExtra;   
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
14a50 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20  after the Index 
14a60 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
14a70 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
14a80 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  r==0 );      /* 
14a90 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
14aa0 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
14ab0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
14ac0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44  ocFailed || IN_D
14ad0 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
14ae0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14af0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
14b00 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
14b10 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
14b20 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
14b30 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14b40 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
14b50 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
14b60 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
14b70 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
14b80 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
14b90 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
14ba0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
14bb0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
14bc0 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
14bd0 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
14be0 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
14bf0 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
14c00 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
14c10 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
14c20 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
14c30 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
14c40 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
14c50 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
14c60 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
14c70 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
14c80 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
14c90 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
14ca0 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
14cb0 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
14cc0 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
14cd0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14ce0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
14cf0 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
14d00 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
14d10 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
14d20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
14d30 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
14d40 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
14d50 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
14d60 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
14d70 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
14d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
14d90 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
14da0 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
14db0 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
14dc0 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
14dd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
14de0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
14df0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
14e00 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
14e10 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
14e20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
14e30 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
14e40 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
14e50 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
14e60 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
14e70 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
14e80 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
14e90 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49  .    sqlite3FixI
14ea0 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
14eb0 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
14ec0 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
14ed0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
14ee0 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
14ef0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  me) ){.      /* 
14f00 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
14f10 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
14f20 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
14f30 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
14f40 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
14f50 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
14f60 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
14f70 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
14f80 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
14f90 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
14fa0 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
14fb0 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  0, &pTblName->a[
14fc0 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
14fd0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14fe0 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
14ff0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
15000 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
15010 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
15020 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
15030 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
15040 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
15050 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
15060 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
15070 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
15080 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
15090 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
150a0 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
150b0 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
150c0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
150d0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
150e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
150f0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
15100 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
15110 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
15120 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
15130 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
15140 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
15150 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
15160 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15170 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
15180 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
15190 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
151a0 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
151b0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
151c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
151d0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
151e0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
151f0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
15200 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
15210 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
15220 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
15230 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
15240 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
15250 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
15260 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
15270 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15280 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
15290 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
152a0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
152b0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
152c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
152d0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
152e0 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
152f0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
15300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15310 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
15320 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
15330 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
15340 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15350 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
15360 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
15370 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
15380 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
15390 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
153a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
153b0 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
153c0 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
153d0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
153e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
153f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
15400 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
15410 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
15420 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
15430 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
15440 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
15450 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
15460 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
15470 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
15480 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
15490 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
154a0 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
154b0 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
154c0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
154d0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
154e0 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
154f0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
15500 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
15510 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
15520 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
15530 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
15540 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
15550 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
15560 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
15570 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
15580 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
15590 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
155a0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
155b0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
155c0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
155d0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
155e0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
155f0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
15600 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
15610 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
15620 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
15630 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
15640 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
15650 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
15660 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
15670 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
15680 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15690 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
156a0 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
156b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
156c0 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
156d0 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
156e0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
156f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15700 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
15710 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
15720 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
15730 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
15740 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
15750 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
15760 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15770 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
15780 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
15790 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
157a0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
157b0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
157c0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
157d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
157e0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
157f0 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  ame, pDb->zName)
15800 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
15810 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
15820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
15830 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
15840 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
15850 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
15860 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
15870 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15880 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
15890 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
158a0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
158b0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
158c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
158d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
158e0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
158f0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  lse{.    int n;.
15900 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
15910 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
15920 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
15930 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
15940 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
15950 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  +){}.    zName =
15960 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
15970 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  db, "sqlite_auto
15980 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54  index_%s_%d", pT
15990 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  ab->zName, n);. 
159a0 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
159b0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
159c0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
159d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
159e0 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
159f0 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
15a00 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
15a10 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
15a20 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
15a30 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
15a40 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
15a50 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b->zName;.    if
15a60 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
15a70 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
15a80 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
15a90 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
15aa0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
15ab0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
15ac0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
15ad0 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
15ae0 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
15af0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
15b00 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
15b10 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
15b20 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
15b30 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15b40 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
15b50 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
15b60 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
15b70 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
15b80 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
15b90 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
15ba0 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
15bb0 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
15bc0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
15bd0 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
15be0 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
15bf0 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
15c00 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
15c10 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
15c20 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
15c30 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
15c40 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
15c50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
15c60 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c  t==0 ){.    null
15c70 49 64 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Id.z = pTab->aCo
15c80 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
15c90 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c 49  zName;.    nullI
15ca0 64 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  d.n = sqlite3Str
15cb0 6c 65 6e 33 30 28 28 63 68 61 72 2a 29 6e 75 6c  len30((char*)nul
15cc0 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73  lId.z);.    pLis
15cd0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
15ce0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
15cf0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
15d00 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
15d10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15d20 65 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ex;.    sqlite3E
15d30 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
15d40 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 26 6e  Parse, pList, &n
15d50 75 6c 6c 49 64 2c 20 30 29 3b 0a 20 20 20 20 70  ullId, 0);.    p
15d60 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
15d70 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f  rder = (u8)sortO
15d80 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
15d90 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
15da0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
15db0 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
15dc0 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
15dd0 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
15de0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
15df0 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
15e00 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
15e10 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
15e20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
15e30 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
15e40 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
15e50 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
15e60 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
15e70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  ==TK_COLLATE );.
15e80 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
15e90 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
15ea0 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
15eb0 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  oken));.    }.  
15ec0 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
15ed0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
15ee0 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
15ef0 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
15f00 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
15f10 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69  e);.  nCol = pLi
15f20 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
15f30 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  dex = sqlite3DbM
15f40 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
15f50 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
15f60 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20  of(Index)) +    
15f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15f80 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
15f90 0a 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69  .      ROUND8(si
15fa0 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 28 6e  zeof(tRowcnt)*(n
15fb0 43 6f 6c 2b 31 29 29 20 2b 20 20 20 2f 2a 20 49  Col+1)) +   /* I
15fc0 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20  ndex.aiRowEst   
15fd0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
15fe0 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20  char *)*nCol +  
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16000 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
16010 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
16020 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(int)*nCol +   
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d  /* Index.aiColum
16050 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  n   */.      siz
16060 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20  eof(u8)*nCol +  
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
16090 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e  Order */.      n
160a0 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  Name + 1 +      
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61      /* Index.zNa
160d0 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  me      */.     
160e0 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
16110 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
16120 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  s */.  );.  if( 
16130 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16140 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
16150 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
16160 20 20 7d 0a 20 20 7a 45 78 74 72 61 20 3d 20 28    }.  zExtra = (
16170 63 68 61 72 2a 29 70 49 6e 64 65 78 3b 0a 20 20  char*)pIndex;.  
16180 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
16190 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29 26 7a 45   = (tRowcnt*)&zE
161a0 78 74 72 61 5b 52 4f 55 4e 44 38 28 73 69 7a 65  xtra[ROUND8(size
161b0 6f 66 28 49 6e 64 65 78 29 29 5d 3b 0a 20 20 70  of(Index))];.  p
161c0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20  Index->azColl = 
161d0 28 63 68 61 72 2a 2a 29 0a 20 20 20 20 20 28 28  (char**).     ((
161e0 63 68 61 72 2a 29 70 49 6e 64 65 78 2d 3e 61 69  char*)pIndex->ai
161f0 52 6f 77 45 73 74 20 2b 20 52 4f 55 4e 44 38 28  RowEst + ROUND8(
16200 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
16210 6e 43 6f 6c 2b 31 29 29 3b 0a 20 20 61 73 73 65  nCol+1));.  asse
16220 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
16230 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
16240 3e 61 69 52 6f 77 45 73 74 29 20 29 3b 0a 20 20  >aiRowEst) );.  
16250 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
16260 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
16270 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a  dex->azColl) );.
16280 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
16290 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49  mn = (int *)(&pI
162a0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  ndex->azColl[nCo
162b0 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  l]);.  pIndex->a
162c0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20  SortOrder = (u8 
162d0 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f  *)(&pIndex->aiCo
162e0 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70  lumn[nCol]);.  p
162f0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28  Index->zName = (
16300 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
16310 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c  >aSortOrder[nCol
16320 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28  ]);.  zExtra = (
16330 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d  char *)(&pIndex-
16340 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29  >zName[nName+1])
16350 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65  ;.  memcpy(pInde
16360 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  x->zName, zName,
16370 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e   nName+1);.  pIn
16380 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54  dex->pTable = pT
16390 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43  ab;.  pIndex->nC
163a0 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  olumn = pList->n
163b0 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Expr;.  pIndex->
163c0 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e  onError = (u8)on
163d0 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d  Error;.  pIndex-
163e0 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f  >uniqNotNull = o
163f0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
16400 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f  ;.  pIndex->auto
16410 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61  Index = (u8)(pNa
16420 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78  me==0);.  pIndex
16430 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
16440 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
16450 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65  ;.  if( pPIWhere
16460 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
16470 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
16480 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
16490 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50  , NC_PartIdx, pP
164a0 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  IWhere, 0);.    
164b0 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78  pIndex->pPartIdx
164c0 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65  Where = pPIWhere
164d0 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d  ;.    pPIWhere =
164e0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
164f0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
16500 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
16510 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  , 0) );..  /* Ch
16520 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
16530 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
16540 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
16550 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
16560 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
16570 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
16580 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
16590 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
165a0 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
165b0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
165c0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
165d0 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
165e0 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
165f0 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
16600 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
16610 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
16620 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
16630 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
16640 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
16650 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
16660 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
16670 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
16680 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
16690 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a   found..  **.  *
166a0 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74  * TODO:  Add a t
166b0 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  est to make sure
166c0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
166d0 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d  olumn is not nam
166e0 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61  ed.  ** more tha
166f0 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68  n once within th
16700 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f  e same index.  O
16710 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e  nly the first in
16720 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74  stance of.  ** t
16730 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65  he column will e
16740 76 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74  ver be used by t
16750 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e  he optimizer.  N
16760 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74  ote that using t
16770 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c  he.  ** same col
16780 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  umn more than on
16790 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ce cannot be an 
167a0 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68  error because th
167b0 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62  at would .  ** b
167c0 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63  reak backwards c
167d0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69  ompatibility - i
167e0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20  t needs to be a 
167f0 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  warning..  */.  
16800 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
16810 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
16820 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
16830 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
16840 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16850 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
16860 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
16870 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
16880 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61  rtOrder;.    cha
16890 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
168a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
168b0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
168c0 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66  e name */..    f
168d0 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d  or(j=0, pTabCol=
168e0 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
168f0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
16900 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  TabCol++){.     
16910 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
16920 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54  Cmp(zColName, pT
16930 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  abCol->zName)==0
16940 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
16950 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
16960 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
16970 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16980 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
16990 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
169a0 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
169b0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a    pTab->zName, z
169c0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
169d0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
169e0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  ema = 1;.      g
169f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
16a00 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
16a10 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
16a20 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66  n[i] = j;.    if
16a30 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
16a40 70 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  pr ){.      int 
16a50 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61 73 73  nColl;.      ass
16a60 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e  ert( pListItem->
16a70 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
16a80 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 7a  LLATE );.      z
16a90 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
16aa0 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ->pExpr->u.zToke
16ab0 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d  n;.      nColl =
16ac0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16ad0 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20  (zColl) + 1;.   
16ae0 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
16af0 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  a>=nColl );.    
16b00 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
16b10 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a   zColl, nColl);.
16b20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
16b30 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74  xtra;.      zExt
16b40 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra += nColl;.   
16b50 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f     nExtra -= nCo
16b60 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
16b70 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
16b80 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
16b90 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f  ;.      if( !zCo
16ba0 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49  ll ) zColl = "BI
16bb0 4e 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20 20 20  NARY";.    }.   
16bc0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
16bd0 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c  usy && !sqlite3L
16be0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
16bf0 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
16c00 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
16c10 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
16c20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
16c30 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
16c40 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
16c50 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
16c60 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
16c70 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
16c80 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
16c90 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38  rtOrder[i] = (u8
16ca0 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72  )requestedSortOr
16cb0 64 65 72 3b 0a 20 20 20 20 69 66 28 20 70 54 61  der;.    if( pTa
16cc0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
16cd0 6c 6c 3d 3d 30 20 29 20 70 49 6e 64 65 78 2d 3e  ll==0 ) pIndex->
16ce0 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  uniqNotNull = 0;
16cf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
16d00 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
16d10 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  ex);.  if( pPars
16d20 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
16d30 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  ) estimateIndexW
16d40 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20  idth(pIndex);.. 
16d50 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73   if( pTab==pPars
16d60 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a  e->pNewTable ){.
16d70 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74      /* This rout
16d80 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ine has been cal
16d90 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  led to create an
16da0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
16db0 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73   as a.    ** res
16dc0 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59  ult of a PRIMARY
16dd0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
16de0 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d  lause on a colum
16df0 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72  n definition, or
16e00 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52  .    ** a PRIMAR
16e10 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
16e20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67  clause following
16e30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69   the column defi
16e40 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20  nitions..    ** 
16e50 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20  i.e. one of:.   
16e60 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54   **.    ** CREAT
16e70 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d  E TABLE t(x PRIM
16e80 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20  ARY KEY, y);.   
16e90 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
16ea0 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28   t(x, y, UNIQUE(
16eb0 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20  x, y));.    **. 
16ec0 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79     ** Either way
16ed0 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
16ee0 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
16ef0 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20  ady has such an 
16f00 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a  index. If.    **
16f10 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65   so, don't bothe
16f20 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20  r creating this 
16f30 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61  one. This only a
16f40 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a  pplies to.    **
16f50 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
16f60 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20  reated indices. 
16f70 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20  Users can do as 
16f80 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20  they wish with. 
16f90 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69     ** explicit i
16fa0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20  ndices..    **. 
16fb0 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45     ** Two UNIQUE
16fc0 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
16fd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
16fe0 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76  considered equiv
16ff0 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e  alent.    ** (an
17000 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69  d thus suppressi
17010 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e  ng the second on
17020 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  e) even if they 
17030 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20  have different. 
17040 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72     ** sort order
17050 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
17060 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
17070 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e  fferent collatin
17080 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69  g sequences or i
17090 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
170a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73  .    ** the cons
170b0 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20  traint occur in 
170c0 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73  different orders
170d0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
170e0 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a  raints are.    *
170f0 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73  * considered dis
17100 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72  tinct and both r
17110 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74  esult in separat
17120 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  e indices..    *
17130 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
17140 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
17150 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
17160 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
17170 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
17180 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
17190 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
171a0 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20  =OE_None );.    
171b0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
171c0 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20  autoIndex );.   
171d0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
171e0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
171f0 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  one );..      if
17200 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21  ( pIdx->nColumn!
17210 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
17220 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17230 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
17240 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  dx->nColumn; k++
17250 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
17260 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20   char *z1;.     
17270 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17280 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  2;.        if( p
17290 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
172a0 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
172b0 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
172c0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78         z1 = pIdx
172d0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
172e0 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78       z2 = pIndex
172f0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
17300 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20       if( z1!=z2 
17310 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
17320 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61  p(z1, z2) ) brea
17330 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
17340 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43   if( k==pIdx->nC
17350 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
17360 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
17370 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
17380 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
17390 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
173a0 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
173b0 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
173c0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
173d0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
173e0 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
173f0 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
17400 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
17410 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
17420 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
17430 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
17440 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
17450 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
17460 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
17470 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
17480 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
17490 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
174a0 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
174b0 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
174c0 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
174d0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
174e0 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
174f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
17500 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
17510 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20  ed behavior for 
17520 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
17530 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17540 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
17550 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
17560 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
17570 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
17580 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
17590 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
175a0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
175b0 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
175c0 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
175d0 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
175e0 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
175f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17600 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
17610 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
17620 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
17630 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
17640 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
17650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
17670 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17680 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
17690 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e   }.  }..  /* Lin
176a0 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
176b0 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
176c0 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
176d0 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
176e0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
176f0 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
17700 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
17710 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
17720 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72  ex *p;.    asser
17730 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
17740 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
17750 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
17760 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
17770 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
17780 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
17790 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
177c0 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  me, sqlite3Strle
177d0 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  n30(pIndex->zNam
177e0 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
17800 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
17810 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17820 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
17830 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
17840 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
17850 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
17860 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
17870 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17880 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
17890 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
178a0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
178b0 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
178c0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
178d0 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
178e0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
178f0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
17900 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
17910 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65  it.busy is 0 the
17920 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64  n create the ind
17930 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69  ex on disk.  Thi
17940 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20  s.  ** involves 
17950 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65  writing the inde
17960 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65  x into the maste
17970 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c  r table and fill
17980 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ing in the.  ** 
17990 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63  index with the c
179a0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e  urrent table con
179b0 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tents..  **.  **
179c0 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   The db->init.bu
179d0 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65  sy is 0 when the
179e0 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65   user first ente
179f0 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45  rs a CREATE INDE
17a00 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e  X .  ** command.
17a10 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
17a20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61  is 1 when a data
17a30 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61  base is opened a
17a40 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20  nd .  ** CREATE 
17a50 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73  INDEX statements
17a60 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66   are read out of
17a70 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
17a80 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20  e.  In.  ** the 
17a90 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20  latter case the 
17aa0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
17ab0 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68  ists on disk, wh
17ac0 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20  ich is why.  ** 
17ad0 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
17ae0 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20   recreate it..  
17af0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
17b00 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
17b10 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
17b20 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69  nerated as a pri
17b30 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72  mary key.  ** or
17b40 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
17b50 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54  nt of a CREATE T
17b60 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
17b70 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
17b80 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
17b90 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
17ba0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
17bb0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
17bc0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
17bd0 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
17be0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
17bf0 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e  lse if( pParse->
17c00 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 56  nErr==0 ){.    V
17c10 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
17c20 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
17c30 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
17c40 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d  ->nMem;..    v =
17c50 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
17c60 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
17c70 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
17c80 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17c90 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
17ca0 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
17cb0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
17cc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
17cd0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
17ce0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
17cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17d00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
17d10 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
17d20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  iMem);..    /* G
17d30 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
17d40 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
17d50 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
17d60 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
17d70 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
17d80 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
17d90 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
17da0 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
17db0 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  )(pParse->sLastT
17dc0 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  oken.z - pName->
17dd0 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61  z) + pParse->sLa
17de0 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  stToken.n;.     
17df0 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d   if( pName->z[n-
17e00 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20  1]==';' ) n--;. 
17e10 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
17e20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
17e30 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
17e40 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
17e50 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
17e60 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
17e70 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  , "CREATE%s INDE
17e80 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
17e90 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
17ea0 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
17eb0 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29  E", n, pName->z)
17ec0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17ed0 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74     /* An automat
17ee0 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  ic index created
17ef0 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
17f00 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
17f10 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
17f20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  /* zStmt = sqlit
17f30 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a  e3MPrintf(""); *
17f40 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
17f50 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
17f60 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e   Add an entry in
17f70 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66   sqlite_master f
17f80 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20  or this index.  
17f90 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
17fa0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
17fb0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e  se, .        "IN
17fc0 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20  SERT INTO %Q.%s 
17fd0 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25  VALUES('index',%
17fe0 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a  Q,%Q,#%d,%Q);",.
17ff0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
18000 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
18010 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
18020 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
18030 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
18040 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
18050 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20     iMem,.       
18060 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
18070 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18080 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
18090 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
180a0 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
180b0 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
180c0 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
180d0 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
180e0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
180f0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
18100 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
18110 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
18120 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18130 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
18140 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
18150 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
18160 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
18170 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
18180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18190 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
181a0 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73   iDb,.         s
181b0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
181c0 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  , "name='%q' AND
181d0 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20   type='index'", 
181e0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
181f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18200 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
18210 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d  xpire, 0);.    }
18220 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
18230 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
18240 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
18250 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
18260 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
18270 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
18280 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
18290 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
182a0 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
182b0 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
182c0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
182d0 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
182e0 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  t constraint che
182f0 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  ck.  ** processi
18300 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65  ng (in sqlite3Ge
18310 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
18320 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72  Checks()) as par
18330 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45  t of.  ** UPDATE
18340 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74   and INSERT stat
18350 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  ements.  .  */. 
18360 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
18370 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
18380 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
18390 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
183a0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
183b0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
183c0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
183d0 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
183e0 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
183f0 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
18400 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
18410 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
18420 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
18430 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
18440 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
18450 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
18460 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
18470 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
18480 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
18490 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
184a0 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
184b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
184c0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
184d0 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
184e0 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
184f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
18500 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  x;.    }.    pRe
18510 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
18520 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
18530 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
18540 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
18550 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
18560 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
18570 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c   ) freeIndex(db,
18580 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
18590 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
185a0 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73  , pPIWhere);.  s
185b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
185c0 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
185d0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
185e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c  tDelete(db, pTbl
185f0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
18600 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
18610 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
18620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20  ;.}../*.** Fill 
18630 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45  the Index.aiRowE
18640 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20  st[] array with 
18650 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74  default informat
18660 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f  ion - informatio
18670 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20  n.** to be used 
18680 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74  when we have not
18690 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45   run the ANALYZE
186a0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
186b0 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73  aiRowEst[0] is s
186c0 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69  uppose to contai
186d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
186e0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
186f0 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
18700 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
18710 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
18720 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
18730 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
18740 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
18750 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
18760 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
18770 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
18780 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
18790 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
187a0 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
187b0 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
187c0 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
187d0 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
187e0 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
187f0 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74  icular combiniat
18800 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  ion of the first
18810 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66   2 columns.** of
18820 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64   the index.  And
18830 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d   so forth.  It m
18840 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68  ust always be th
18850 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a  e case that.*.**
18860 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
18870 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74  Est[N]<=aiRowEst
18880 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20  [N-1].**        
18890 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d     aiRowEst[N]>=
188a0 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72  1.**.** Apart fr
188b0 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65  om that, we have
188c0 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e   little to go on
188d0 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69   besides intuiti
188e0 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20  on as to.** how 
188f0 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c  aiRowEst[] shoul
18900 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  d be initialized
18910 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67  .  The numbers g
18920 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a  enerated here.**
18930 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79   are based on ty
18940 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75  pical values fou
18950 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64  nd in actual ind
18960 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ices..*/.void sq
18970 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
18980 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  st(Index *pIdx){
18990 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 20 3d 20  .  tRowcnt *a = 
189a0 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  pIdx->aiRowEst;.
189b0 20 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63    int i;.  tRowc
189c0 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
189d0 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d  a!=0 );.  a[0] =
189e0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
189f0 52 6f 77 45 73 74 3b 0a 20 20 69 66 28 20 61 5b  RowEst;.  if( a[
18a00 30 5d 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20 31  0]<10 ) a[0] = 1
18a10 30 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66  0;.  n = 10;.  f
18a20 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d  or(i=1; i<=pIdx-
18a30 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
18a40 20 20 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20      a[i] = n;.  
18a50 20 20 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b    if( n>5 ) n--;
18a60 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d  .  }.  if( pIdx-
18a70 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
18a80 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d  e ){.    a[pIdx-
18a90 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20  >nColumn] = 1;. 
18aa0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
18ab0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
18ac0 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
18ad0 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
18ae0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
18af0 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
18b00 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
18b10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18b20 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
18b30 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
18b40 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
18b50 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
18b60 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
18b70 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
18b80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
18b90 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61  .  int iDb;..  a
18ba0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
18bb0 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e  Err==0 );   /* N
18bc0 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
18bd0 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
18be0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
18bf0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
18c00 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
18c10 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
18c20 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
18c30 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
18c40 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
18c50 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
18c60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
18c70 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
18c80 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
18c90 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
18ca0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
18cb0 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
18cc0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
18cd0 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
18ce0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
18cf0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18d00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18d10 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
18d20 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
18d30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18d40 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
18d50 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
18d60 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
18d70 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
18d80 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
18d90 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
18da0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
18db0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
18dc0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
18dd0 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
18de0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18df0 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
18e00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
18e10 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
18e20 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
18e30 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
18e40 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
18e50 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
18e60 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
18e70 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
18e80 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
18e90 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
18ea0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18eb0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
18ec0 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
18ed0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
18ee0 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
18ef0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
18f00 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
18f10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
18f20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
18f30 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
18f40 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
18f50 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
18f60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
18f70 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
18f80 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
18f90 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
18fa0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
18fb0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
18fc0 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
18fd0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29  _TEMPDB && iDb )
18fe0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
18ff0 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
19000 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
19010 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
19020 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
19030 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
19040 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
19050 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
19060 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
19070 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
19080 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
19090 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
190a0 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
190b0 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
190c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
190d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
190e0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
190f0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
19100 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
19110 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
19120 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
19130 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
19140 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
19150 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44  HERE name=%Q AND
19160 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a   type='index'",.
19170 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
19180 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
19190 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49  A_TABLE(iDb), pI
191a0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
191b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c  );.    sqlite3Cl
191c0 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
191d0 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22  arse, iDb, "idx"
191e0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
191f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
19200 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
19210 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
19220 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
19230 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
19240 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
19250 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19260 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69   OP_DropIndex, i
19270 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  Db, 0, 0, pIndex
19280 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
19290 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
192a0 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
192b0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
192c0 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
192d0 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  Array is a point
192e0 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  er to an array o
192f0 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20  f objects. Each 
19300 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
19310 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72   array is szEntr
19320 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
19330 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
19340 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c  es sqlite3DbReal
19350 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65  loc().** to exte
19360 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20  nd the array so 
19370 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70  that there is sp
19380 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62  ace for a new ob
19390 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e  ject at the end.
193a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
193b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
193c0 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f  led, *pnEntry co
193d0 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65  ntains the curre
193e0 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68  nt size of.** th
193f0 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72  e array (in entr
19400 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c  ies - so the all
19410 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e  ocation is ((*pn
19420 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79  Entry) * szEntry
19430 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f  ) bytes.** in to
19440 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tal)..**.** If t
19450 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20  he realloc() is 
19460 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e  successful (i.e.
19470 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69   if no OOM condi
19480 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68  tion occurs), th
19490 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63  e.** space alloc
194a0 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77  ated for the new
194b0 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65   object is zeroe
194c0 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61  d, *pnEntry upda
194d0 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63  ted to.** reflec
194e0 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f  t the new size o
194f0 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20  f the array and 
19500 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
19510 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a   new allocation.
19520 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49  ** returned. *pI
19530 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
19540 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65   index of the ne
19550 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e  w array entry in
19560 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
19570 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
19580 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61  the realloc() fa
19590 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65  ils, *pIdx is se
195a0 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72  t to -1, *pnEntr
195b0 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63  y remains.** unc
195c0 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70  hanged and a cop
195d0 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75  y of pArray retu
195e0 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  rned..*/.void *s
195f0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
19600 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
19610 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
19620 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
19630 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
19640 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
19650 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
19660 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
19670 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
19680 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
19690 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
196a0 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
196b0 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
196c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74   */.  int *pnEnt
196d0 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ry,     /* Numbe
196e0 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72  r of objects cur
196f0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f  rently in use */
19700 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20  .  int *pIdx    
19710 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
19720 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77  e index of a new
19730 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b   slot here */.){
19740 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
19750 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a  t n = *pnEntry;.
19760 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29    if( (n & (n-1)
19770 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
19780 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20  sz = (n==0) ? 1 
19790 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20  : 2*n;.    void 
197a0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  *pNew = sqlite3D
197b0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72  bRealloc(db, pAr
197c0 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29  ray, sz*szEntry)
197d0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
197e0 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78  0 ){.      *pIdx
197f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
19800 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20  urn pArray;.    
19810 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70  }.    pArray = p
19820 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28  New;.  }.  z = (
19830 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20  char*)pArray;.  
19840 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a  memset(&z[n * sz
19850 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
19860 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e  ry);.  *pIdx = n
19870 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a  ;.  ++*pnEntry;.
19880 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
19890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
198a0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
198b0 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
198c0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
198d0 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
198e0 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
198f0 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
19900 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
19910 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
19920 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
19930 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
19940 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  d(sqlite3 *db, I
19950 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
19960 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
19970 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
19980 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
19990 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
199a0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
199b0 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
199c0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
199d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
199e0 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
199f0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
19a00 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20  e(.      db,.   
19a10 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20     pList->a,.   
19a20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d     sizeof(pList-
19a30 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70  >a[0]),.      &p
19a40 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
19a50 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
19a60 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
19a70 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
19a80 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
19a90 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
19aa0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
19ab0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
19ac0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
19ad0 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  n);.  return pLi
19ae0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
19af0 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
19b00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
19b10 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
19b20 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
19b30 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
19b40 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
19b50 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
19b60 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
19b70 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
19b80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19b90 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
19ba0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19bb0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
19bc0 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
19bd0 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
19be0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19bf0 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
19c00 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
19c10 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
19c20 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
19c30 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
19c40 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
19c50 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
19c60 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
19c70 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
19c80 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
19c90 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
19ca0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
19cb0 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
19cc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
19cd0 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
19ce0 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
19cf0 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
19d00 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
19d10 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20  }../*.** Expand 
19d20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
19d30 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  ted for the give
19d40 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  n SrcList object
19d50 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20   by.** creating 
19d60 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73  nExtra new slots
19d70 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   beginning at iS
19d80 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73  tart.  iStart is
19d90 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20   zero based..** 
19da0 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65  New slots are ze
19db0 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  roed..**.** For 
19dc0 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65  example, suppose
19dd0 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69   a SrcList initi
19de0 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77  ally contains tw
19df0 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a  o entries: A,B..
19e00 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e  ** To append 3 n
19e10 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20  ew entries onto 
19e20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73  the end, do this
19e30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
19e40 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
19e50 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33  (db, pSrclist, 3
19e60 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65  , 2);.**.** Afte
19e70 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  r the call above
19e80 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69   it would contai
19e90 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e  n:  A, B, nil, n
19ea0 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74  il, nil..** If t
19eb0 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65  he iStart argume
19ec0 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e  nt had been 1 in
19ed0 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e  stead of 2, then
19ee0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77   the result.** w
19ef0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20  ould have been: 
19f00 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   A, nil, nil, ni
19f10 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e  l, B.  To prepen
19f20 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c  d the new slots,
19f30 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76  .** the iStart v
19f40 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e  alue would be 0.
19f50 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65    The result the
19f60 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e  n would.** be: n
19f70 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c  il, nil, nil, A,
19f80 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d   B..**.** If a m
19f90 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
19fa0 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69   fails the SrcLi
19fb0 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  st is unchanged.
19fc0 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c    The.** db->mal
19fd0 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77  locFailed flag w
19fe0 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72  ill be set to tr
19ff0 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ue..*/.SrcList *
1a000 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1a010 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33  large(.  sqlite3
1a020 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44   *db,       /* D
1a030 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a040 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1a050 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  OOM errors */.  
1a060 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1a070 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73     /* The SrcLis
1a080 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64  t to be enlarged
1a090 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1a0a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
1a0b0 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20  er of new slots 
1a0c0 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e  to add to pSrc->
1a0d0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  a[] */.  int iSt
1a0e0 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49  art         /* I
1a0f0 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b  ndex in pSrc->a[
1a100 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73  ] of first new s
1a110 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lot */.){.  int 
1a120 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  i;..  /* Sanity 
1a130 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c  checking on call
1a140 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
1a150 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
1a160 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rt>=0 );.  asser
1a170 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a  t( nExtra>=1 );.
1a180 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
1a190 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1a1a0 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72  Start<=pSrc->nSr
1a1b0 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  c );..  /* Alloc
1a1c0 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ate additional s
1a1d0 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a  pace if needed *
1a1e0 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  /.  if( pSrc->nS
1a1f0 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e  rc+nExtra>pSrc->
1a200 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
1a210 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
1a220 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53   int nAlloc = pS
1a230 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b  rc->nSrc+nExtra;
1a240 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20  .    int nGot;. 
1a250 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1a260 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
1a270 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
1a280 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63      sizeof(*pSrc
1a290 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ) + (nAlloc-1)*s
1a2a0 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1a2b0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
1a2c0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  w==0 ){.      as
1a2d0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1a2e0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1a2f0 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20  return pSrc;.   
1a300 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e   }.    pSrc = pN
1a310 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28  ew;.    nGot = (
1a320 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1a330 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20  ize(db, pNew) - 
1a340 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73  sizeof(*pSrc))/s
1a350 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1a360 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e  )+1;.    pSrc->n
1a370 41 6c 6c 6f 63 20 3d 20 28 75 38 29 6e 47 6f 74  Alloc = (u8)nGot
1a380 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
1a390 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
1a3a0 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
1a3b0 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
1a3c0 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
1a3d0 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
1a3e0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1a3f0 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
1a400 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
1a410 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
1a420 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
1a430 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28   pSrc->nSrc += (
1a440 69 38 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  i8)nExtra;..  /*
1a450 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
1a460 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
1a470 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
1a480 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
1a490 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
1a4a0 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
1a4b0 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
1a4c0 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
1a4d0 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
1a4e0 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
1a4f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
1a500 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1a510 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
1a520 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
1a530 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
1a540 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
1a550 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
1a560 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
1a570 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
1a580 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1a590 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
1a5a0 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
1a5b0 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
1a5c0 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
1a5d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
1a5e0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1a5f0 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
1a600 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
1a610 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
1a620 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
1a630 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
1a640 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
1a650 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
1a660 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
1a670 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
1a680 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
1a690 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
1a6a0 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
1a6b0 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
1a6c0 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
1a6d0 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
1a6e0 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
1a6f0 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
1a700 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
1a710 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
1a720 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
1a730 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1a740 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
1a750 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
1a760 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
1a770 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
1a780 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
1a790 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
1a7a0 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
1a7b0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1a7c0 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
1a7d0 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
1a7e0 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
1a7f0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1a800 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
1a810 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
1a820 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
1a830 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
1a840 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
1a850 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
1a860 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
1a870 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1a880 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
1a890 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
1a8a0 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
1a8b0 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
1a8c0 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
1a8d0 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
1a8e0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1a8f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1a900 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1a910 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
1a920 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
1a930 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
1a940 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
1a950 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
1a960 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
1a970 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1a980 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1a990 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
1a9a0 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
1a9b0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1a9c0 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
1a9d0 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20  ase name.  If C 
1a9e0 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  is defined.** th
1a9f0 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20  en so is B.  In 
1aa00 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20  other words, we 
1aa10 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73  never have a cas
1aa20 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  e where:.**.**  
1aa30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1aa40 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1aa50 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  0,C);.**.** Both
1aa60 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
1aa70 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65  abase are assume
1aa80 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  d to be quoted. 
1aa90 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74   They are dequot
1aaa0 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69  ed.** before bei
1aab0 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
1aac0 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c  SrcList..*/.SrcL
1aad0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1aae0 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c  istAppend(.  sql
1aaf0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1ab00 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1ab10 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1ab20 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1ab30 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
1ab40 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
1ab50 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
1ab60 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
1ab70 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
1ab80 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
1ab90 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1aba0 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
1abb0 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
1abc0 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
1abd0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
1abe0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1abf0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1ac00 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
1ac10 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
1ac20 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
1ac30 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
1ac40 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
1ac50 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1ac60 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1ac70 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1ac80 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
1ac90 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1aca0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
1acb0 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
1acc0 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71    }.  pList = sq
1acd0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1ace0 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31  rge(db, pList, 1
1acf0 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a  , pList->nSrc);.
1ad00 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1ad10 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
1ad20 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1ad30 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1ad40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ad50 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
1ad60 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
1ad70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
1ad80 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
1ad90 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
1ada0 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1adb0 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
1adc0 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
1add0 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
1ade0 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
1adf0 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
1ae00 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
1ae10 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
1ae20 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1ae30 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
1ae40 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
1ae50 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1ae60 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1ae70 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1ae80 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1ae90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1aea0 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1aeb0 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1aec0 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1aed0 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1aee0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1aef0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1af00 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1af10 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1af20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1af30 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1af40 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1af50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1af60 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1af70 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1af80 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1af90 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1afa0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1afb0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1afc0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1afd0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1afe0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1aff0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1b000 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1b010 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1b020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1b030 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1b040 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1b050 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1b060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b070 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1b080 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1b090 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1b0a0 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1b0b0 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1b0c0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1b0d0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1b0e0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1b0f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1b100 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1b110 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1b120 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1b130 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1b140 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1b150 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1b160 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1b170 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1b180 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1b190 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1b1a0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1b1b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1b1c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1b1d0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1b1e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b1f0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65  db, pItem->zInde
1b200 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  x);.    sqlite3D
1b210 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1b220 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1b230 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1b240 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1b250 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1b260 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1b270 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1b280 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1b290 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1b2a0 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1b2b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1b2c0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1b2d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1b2e0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1b2f0 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
1b300 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
1b310 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
1b320 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
1b330 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
1b340 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
1b350 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
1b360 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
1b370 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1b380 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
1b390 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
1b3a0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1b3b0 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
1b3c0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
1b3d0 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1b3e0 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
1b3f0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
1b400 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
1b410 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1b420 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
1b430 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
1b440 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
1b450 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
1b460 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
1b470 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
1b480 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
1b490 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c   alias, then pAl
1b4a0 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ias points to th
1b4b0 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e  e.** alias token
1b4c0 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69  .  If the term i
1b4d0 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68  s a subquery, th
1b4e0 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20  en pSubquery is 
1b4f0 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  the.** SELECT st
1b500 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  atement that the
1b510 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65   subquery encode
1b520 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61  s.  The pTable a
1b530 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20  nd.** pDatabase 
1b540 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e  parameters are N
1b550 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69  ULL for subqueri
1b560 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64  es.  The pOn and
1b570 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d   pUsing.** param
1b580 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f  eters are the co
1b590 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20  ntent of the ON 
1b5a0 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1b5b0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
1b5c0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68  a new SrcList wh
1b5d0 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74  ich encodes is t
1b5e0 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65  he FROM with the
1b5f0 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64   new.** term add
1b600 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ed..*/.SrcList *
1b610 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1b620 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20  pendFromTerm(.  
1b630 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1b640 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1b650 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1b660 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20  SrcList *p,     
1b670 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1b680 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  eft part of the 
1b690 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65  FROM clause alre
1b6a0 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f  ady seen */.  To
1b6b0 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
1b6c0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b6d0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64   the table to ad
1b6e0 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c  d to the FROM cl
1b6f0 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ause */.  Token 
1b700 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20  *pDatabase,     
1b710 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1b720 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1b730 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20  ning pTable */. 
1b740 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20   Token *pAlias, 
1b750 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b760 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
1b770 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70  of the AS subexp
1b780 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ression */.  Sel
1b790 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20  ect *pSubquery, 
1b7a0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65       /* A subque
1b7b0 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  ry used in place
1b7c0 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
1b7d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c   */.  Expr *pOn,
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b7f0 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   The ON clause o
1b800 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64  f a join */.  Id
1b810 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20  List *pUsing    
1b820 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49        /* The USI
1b830 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  NG clause of a j
1b840 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  oin */.){.  stru
1b850 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1b860 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
1b870 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1b880 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20  db;.  if( !p && 
1b890 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20  (pOn || pUsing) 
1b8a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1b8b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1b8c0 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73  a JOIN clause is
1b8d0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1b8e0 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f   %s", .      (pO
1b8f0 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e  n ? "ON" : "USIN
1b900 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67  G").    );.    g
1b910 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1b920 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d  error;.  }.  p =
1b930 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1b940 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
1b950 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
1b960 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
1b970 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29  EVER(p->nSrc==0)
1b980 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   ){.    goto app
1b990 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
1b9a0 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1b9b0 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1b9c0 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73    assert( pAlias
1b9d0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c  !=0 );.  if( pAl
1b9e0 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ias->n ){.    pI
1b9f0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
1ba00 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1ba10 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a  en(db, pAlias);.
1ba20 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65    }.  pItem->pSe
1ba30 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79  lect = pSubquery
1ba40 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d  ;.  pItem->pOn =
1ba50 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70   pOn;.  pItem->p
1ba60 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a  Using = pUsing;.
1ba70 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70    return p;.. ap
1ba80 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a  pend_from_error:
1ba90 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
1baa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1bab0 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b  Delete(db, pOn);
1bac0 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
1bad0 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e  Delete(db, pUsin
1bae0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  g);.  sqlite3Sel
1baf0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
1bb00 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75  ubquery);.  retu
1bb10 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
1bb20 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  dd an INDEXED BY
1bb30 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   or NOT INDEXED 
1bb40 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f  clause to the mo
1bb50 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
1bb60 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66  d .** element of
1bb70 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
1bb80 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1bb90 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1bba0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1bbb0 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
1bbc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1bbd0 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e  rcList *p, Token
1bbe0 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20   *pIndexedBy){. 
1bbf0 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65   assert( pIndexe
1bc00 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  dBy!=0 );.  if( 
1bc10 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e  p && ALWAYS(p->n
1bc20 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74  Src>0) ){.    st
1bc30 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1bc40 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
1bc50 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [p->nSrc-1];.   
1bc60 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1bc70 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26  notIndexed==0 &&
1bc80 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d   pItem->zIndex==
1bc90 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
1bca0 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
1bcb0 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
1bcc0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
1bcd0 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
1bce0 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
1bcf0 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
1bd00 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
1bd10 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
1bd20 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1bd30 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49       pItem->notI
1bd40 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20  ndexed = 1;.    
1bd50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
1bd60 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c  em->zIndex = sql
1bd70 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1bd80 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
1bd90 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d  ndexedBy);.    }
1bda0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
1bdb0 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
1bdc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
1bdd0 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
1bde0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
1bdf0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
1be00 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
1be10 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
1be20 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1be30 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
1be40 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1be50 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
1be60 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
1be70 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
1be80 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
1be90 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
1bea0 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
1beb0 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
1bec0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
1bed0 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
1bee0 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
1bef0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1bf00 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
1bf10 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
1bf20 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
1bf30 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
1bf40 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
1bf50 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
1bf60 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
1bf70 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
1bf80 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
1bf90 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
1bfa0 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
1bfb0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
1bfc0 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
1bfd0 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
1bfe0 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
1bff0 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
1c000 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
1c010 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
1c020 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
1c030 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1c040 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 20 7c    assert( p->a |
1c050 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b 0a  | p->nSrc==0 );.
1c060 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72      for(i=p->nSr
1c070 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  c-1; i>0; i--){.
1c080 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f        p->a[i].jo
1c090 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d  intype = p->a[i-
1c0a0 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  1].jointype;.   
1c0b0 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a   }.    p->a[0].j
1c0c0 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
1c0d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
1c0e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1c0f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
1c100 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
1c110 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1c120 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
1c130 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1c140 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
1c150 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
1c160 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
1c170 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1c180 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28  db!=0 );./*  if(
1c190 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
1c1a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a  =0 ) return; */.
1c1b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1c1c0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1c1d0 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
1c1e0 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
1c1f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
1c200 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
1c210 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1c220 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65  );.  if( !v ) re
1c230 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65  turn;.  if( type
1c240 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b  !=TK_DEFERRED ){
1c250 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c260 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1c270 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c280 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61  AddOp2(v, OP_Tra
1c290 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
1c2a0 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
1c2b0 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+1);.      sqli
1c2c0 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
1c2d0 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  (v, i);.    }.  
1c2e0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1c2f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1c300 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
1c310 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
1c320 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1c330 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
1c340 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
1c350 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1c360 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
1c370 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1c380 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1c390 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  e->db!=0 );.  if
1c3a0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1c3b0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1c3c0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1c3d0 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
1c3e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1c3f0 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
1c400 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1c410 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1c420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c430 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
1c440 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
1c450 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1c460 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1c470 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
1c480 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
1c490 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1c4a0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1c4b0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1c4c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1c4d0 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
1c4e0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1c4f0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1c500 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1c510 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
1c520 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
1c530 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
1c540 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1c550 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1c560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c570 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1c580 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
1c590 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
1c5a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c5b0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1c5c0 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
1c5d0 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
1c5e0 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
1c5f0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
1c600 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
1c610 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1c620 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
1c630 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
1c640 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
1c650 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
1c660 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1c670 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
1c680 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
1c690 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
1c6a0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1c6b0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
1c6c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c6d0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1c6e0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1c6f0 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b  char * const az[
1c700 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
1c710 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
1c720 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
1c730 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
1c740 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
1c750 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
1c760 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1c770 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
1c780 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
1c790 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1c7a0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
1c7b0 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
1c7c0 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
1c7d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1c7e0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
1c7f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
1c800 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
1c810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1c820 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
1c830 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
1c840 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
1c850 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1c860 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
1c870 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
1c880 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
1c890 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
1c8a0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1c8b0 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
1c8c0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
1c8d0 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
1c8e0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1c8f0 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
1c900 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
1c910 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
1c920 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1c930 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
1c940 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
1c950 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
1c960 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
1c970 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b  .    Btree *pBt;
1c980 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1c990 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
1c9a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1c9b0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1c9c0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1c9d0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
1c9e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1c9f0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1ca00 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1ca10 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1ca20 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
1ca30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
1ca40 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
1ca50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
1ca60 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
1ca70 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67  b, &pBt, 0, flag
1ca80 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
1ca90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1caa0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1cab0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
1cac0 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
1cad0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
1cae0 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
1caf0 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
1cb00 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
1cb10 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
1cb20 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
1cb30 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1cb40 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
1cb50 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  = pBt;.    asser
1cb60 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
1cb70 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
1cb80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
1cb90 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
1cba0 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
1cbb0 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31  nextPagesize, -1
1cbc0 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62  , 0) ){.      db
1cbd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
1cbe0 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
1cbf0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1cc00 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1cc10 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1cc20 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1cc30 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
1cc40 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61  a cookie and sta
1cc50 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61  rt.** a read-tra
1cc60 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  nsaction for all
1cc70 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
1cc80 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  files..**.** It 
1cc90 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
1cca0 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f  t all schema coo
1ccb0 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64  kies be verified
1ccc0 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64   and all.** read
1ccd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65   transactions be
1cce0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1ccf0 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61  anything else ha
1cd00 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ppens in.** the 
1cd10 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42  VDBE program.  B
1cd20 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ut this routine 
1cd30 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66  can be called af
1cd40 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a  ter much other.*
1cd50 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  * code has been 
1cd60 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68  generated.  So h
1cd70 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64  ere is what we d
1cd80 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  o:.**.** The fir
1cd90 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
1cda0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1cdb0 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f  we code an OP_Go
1cdc0 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  to that.** will 
1cdd0 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75  jump to a subrou
1cde0 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20  tine at the end 
1cdf0 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
1ce00 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f   Then we.** reco
1ce10 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73  rd every databas
1ce20 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73  e that needs its
1ce30 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64   schema verified
1ce40 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73   in the.** pPars
1ce50 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69  e->cookieMask fi
1ce60 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74  eld.  Later, aft
1ce70 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64  er all other cod
1ce80 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65  e has been.** ge
1ce90 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62  nerated, the sub
1cea0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
1ceb0 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  s the cookie ver
1cec0 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a  ifications and.*
1ced0 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61  * starts the tra
1cee0 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62  nsactions will b
1cef0 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20  e coded and the 
1cf00 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65  OP_Goto P2 value
1cf10 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  .** will be made
1cf20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1cf30 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1cf40 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
1cf50 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76   the.** cookie v
1cf60 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72  erification subr
1cf70 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70  outine code happ
1cf80 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69  ens in sqlite3Fi
1cf90 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a  nishCoding()..**
1cfa0 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65  .** If iDb<0 the
1cfb0 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f  n code the OP_Go
1cfc0 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20  to only - don't 
1cfd0 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69  set flag to veri
1cfe0 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  fy the.** schema
1cff0 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65   on any database
1d000 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  s.  This can be 
1d010 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
1d020 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20   the OP_Goto.** 
1d030 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64  early in the cod
1d040 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f  e, before we kno
1d050 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73  w if any databas
1d060 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65  e tables will be
1d070 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
1d080 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1d090 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
1d0a0 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
1d0b0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1d0c0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1d0d0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1d0e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1d0f0 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
1d100 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 21    if( pToplevel!
1d110 3d 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 2f  =pParse ){.    /
1d120 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
1d130 20 74 61 6b 65 6e 20 69 66 20 61 20 74 72 69 67   taken if a trig
1d140 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
1d150 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 49 6e   being coded. In
1d160 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 61 73   this.    ** cas
1d170 65 2c 20 73 65 74 20 63 6f 6f 6b 69 65 47 6f 74  e, set cookieGot
1d180 6f 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  o to a non-zero 
1d190 76 61 6c 75 65 20 74 6f 20 73 68 6f 77 20 74 68  value to show th
1d1a0 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
1d1b0 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
1d1c0 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 69 73   called. This is
1d1d0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
1d1e0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
1d1f0 74 61 6e 74 73 28 29 0a 20 20 20 20 2a 2a 20 66  tants().    ** f
1d200 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  unction. */.    
1d210 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1d220 74 6f 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e  to = -1;.  }.#en
1d230 64 69 66 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  dif.  if( pTople
1d240 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  vel->cookieGoto=
1d250 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
1d260 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1d270 62 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20  be(pToplevel);. 
1d280 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
1d290 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
1d2a0 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
1d2b0 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
1d2c0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54   error */.    pT
1d2d0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47  oplevel->cookieG
1d2e0 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
1d2f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1d300 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
1d310 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
1d320 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
1d330 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62   = pToplevel->db
1d340 3b 0a 20 20 20 20 79 44 62 4d 61 73 6b 20 6d 61  ;.    yDbMask ma
1d350 73 6b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  sk;..    assert(
1d360 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
1d370 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1d380 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
1d390 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  || iDb==1 );.   
1d3a0 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
1d3b0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
1d3c0 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
1d3d0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1d3e0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
1d3f0 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 61 73 6b  , 0) );.    mask
1d400 20 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c   = ((yDbMask)1)<
1d410 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70  <iDb;.    if( (p
1d420 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1d430 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
1d440 29 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  ){.      pToplev
1d450 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c  el->cookieMask |
1d460 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 54  = mask;.      pT
1d470 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56  oplevel->cookieV
1d480 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e  alue[iDb] = db->
1d490 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
1d4a0 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b  ->schema_cookie;
1d4b0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
1d4c0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
1d4d0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1d4e0 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1d4f0 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b  base(pToplevel);
1d500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d510 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
1d520 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e  rgument zDb is N
1d530 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73  ULL, then call s
1d540 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1d550 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63  Schema() for eac
1d560 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  h .** attached d
1d570 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69  atabase. Otherwi
1d580 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f  se, invoke it fo
1d590 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  r the database n
1d5a0 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a  amed zDb only..*
1d5b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1d5c0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1d5d0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
1d5e0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1d5f0 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
1d600 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d610 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1d620 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1d630 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
1d640 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
1d650 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
1d660 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d  t && (!zDb || 0=
1d670 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1d680 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  zDb, pDb->zName)
1d690 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1d6a0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1d6b0 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ma(pParse, i);. 
1d6c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1d6d0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
1d6e0 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
1d6f0 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
1d700 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
1d710 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
1d720 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
1d730 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d740 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
1d750 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
1d760 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
1d770 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
1d780 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
1d790 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
1d7a0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
1d7b0 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
1d7c0 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
1d7d0 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
1d7e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
1d7f0 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
1d800 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
1d810 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
1d820 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
1d830 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
1d840 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
1d850 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
1d860 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
1d870 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
1d880 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
1d890 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
1d8a0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
1d8b0 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
1d8c0 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
1d8d0 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
1d8e0 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
1d8f0 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
1d900 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
1d910 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
1d920 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
1d930 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
1d940 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
1d950 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
1d960 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
1d970 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
1d980 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1d990 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
1d9a0 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
1d9b0 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
1d9c0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1d9d0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1d9e0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1d9f0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  se);.  sqlite3Co
1da00 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1da10 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70  Parse, iDb);.  p
1da20 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d  Toplevel->writeM
1da30 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b  ask |= ((yDbMask
1da40 29 31 29 3c 3c 69 44 62 3b 0a 20 20 70 54 6f 70  )1)<<iDb;.  pTop
1da50 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
1da60 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d  ite |= setStatem
1da70 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ent;.}../*.** In
1da80 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1da90 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e  statement curren
1daa0 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
1dab0 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69  uction might wri
1dac0 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  te.** more than 
1dad0 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70  one entry (examp
1dae0 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65  le: deleting one
1daf0 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74   row then insert
1db00 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20  ing another,.** 
1db10 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70  inserting multip
1db20 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62  le rows in a tab
1db30 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  le, or inserting
1db40 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78   a row and index
1db50 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66   entries.).** If
1db60 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73   an abort occurs
1db70 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74   after some of t
1db80 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65  hese writes have
1db90 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e   completed, then
1dba0 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e   it will.** be n
1dbb0 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
1dbc0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77   the completed w
1dbd0 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rites..*/.void s
1dbe0 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
1dbf0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1dc00 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
1dc10 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1dc20 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1dc30 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
1dc40 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20  >isMultiWrite = 
1dc50 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  1;.}../* .** The
1dc60 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1dc70 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
1dc80 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65  ne if is discove
1dc90 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  rs that it is.**
1dca0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f   possible to abo
1dcb0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70  rt a statement p
1dcc0 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69  rior to completi
1dcd0 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  on.  In order to
1dce0 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69   .** perform thi
1dcf0 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20  s abort without 
1dd00 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
1dd10 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64  atabase, we need
1dd20 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   to make.** sure
1dd30 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
1dd40 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64  ent is protected
1dd50 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20   by a statement 
1dd60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1dd70 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  ** Technically, 
1dd80 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
1dd90 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74  set the mayAbort
1dda0 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20   flag if the.** 
1ddb0 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61  isMultiWrite fla
1ddc0 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  g was previously
1ddd0 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20   set.  There is 
1dde0 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  a time dependenc
1ddf0 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74  y.** such that t
1de00 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63  he abort must oc
1de10 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75  cur after the mu
1de20 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20  ltiwrite.  This 
1de30 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74  makes.** some st
1de40 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69  atements involvi
1de50 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63  ng the REPLACE c
1de60 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
1de70 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20  on algorithm.** 
1de80 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  go a little fast
1de90 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20  er.  But taking 
1dea0 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69  advantage of thi
1deb0 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  s time dependenc
1dec0 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f  y.** makes it mo
1ded0 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20  re difficult to 
1dee0 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63  prove that the c
1def0 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28  ode is correct (
1df00 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  in .** particula
1df10 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75  r, it prevents u
1df20 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61  s from writing a
1df30 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69  n effective.** i
1df40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1df50 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
1df60 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f  yAbort()) and so
1df70 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a   we have chosen.
1df80 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73  ** to take the s
1df90 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b  afe route and sk
1dfa0 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  ip the optimizat
1dfb0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
1dfc0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72  ite3MayAbort(Par
1dfd0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
1dfe0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1dff0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1e000 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1e010 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79    pToplevel->may
1e020 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Abort = 1;.}../*
1e030 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
1e040 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20  alt that causes 
1e050 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75  the vdbe to retu
1e060 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  rn an SQLITE_CON
1e070 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72  STRAINT.** error
1e080 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61  . The onError pa
1e090 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
1e0a0 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79  es which (if any
1e0b0 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) of the stateme
1e0c0 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72  nt.** and/or cur
1e0d0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1e0e0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1e0f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e100 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a  HaltConstraint(.
1e110 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1e120 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1e130 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
1e140 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a  errCode,      /*
1e150 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20   extended error 
1e160 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  code */.  int on
1e170 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
1e180 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
1e190 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20  /.  char *p4,   
1e1a0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
1e1b0 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  essage */.  int 
1e1c0 70 34 74 79 70 65 20 20 20 20 20 20 20 20 2f 2a  p4type        /*
1e1d0 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34   P4_STATIC or P4
1e1e0 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 29 7b  _TRANSIENT */.){
1e1f0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
1e200 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1e210 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  se);.  assert( (
1e220 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53  errCode&0xff)==S
1e230 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
1e240 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f   );.  if( onErro
1e250 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
1e260 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
1e270 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
1e280 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e290 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
1e2a0 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72  errCode, onError
1e2b0 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29  , 0, p4, p4type)
1e2c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
1e2d0 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65   to see if pInde
1e2e0 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  x uses the colla
1e2f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
1e300 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  oll.  Return.** 
1e310 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20  true if it does 
1e320 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  and false if it 
1e330 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66  does not..*/.#if
1e340 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e350 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
1e360 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74  int collationMat
1e370 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ch(const char *z
1e380 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
1e390 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  dex){.  int i;. 
1e3a0 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
1e3b0 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
1e3c0 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
1e3d0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
1e3e0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
1e3f0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
1e400 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
1e410 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73   );.    if( 0==s
1e420 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
1e430 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
1e440 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1e450 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1e460 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1e470 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1e480 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
1e490 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
1e4a0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1e4b0 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
1e4c0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
1e4d0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
1e4e0 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
1e4f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e500 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
1e510 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
1e520 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e530 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
1e540 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
1e550 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1e560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1e570 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
1e580 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
1e590 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
1e5a0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1e5b0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
1e5c0 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
1e5d0 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
1e5e0 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
1e5f0 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
1e600 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
1e610 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1e620 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1e630 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1e640 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
1e650 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1e660 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
1e670 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
1e680 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1e690 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1e6a0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
1e6b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1e6c0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1e6d0 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
1e6e0 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
1e6f0 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
1e700 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
1e710 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1e720 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
1e730 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
1e740 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
1e750 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
1e760 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1e770 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1e780 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1e790 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
1e7a0 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
1e7b0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
1e7c0 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7e0 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
1e7f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e810 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1e820 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1e830 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1e840 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1e850 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1e860 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1e870 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e890 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1e8a0 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
1e8b0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1e8c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e8d0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
1e8e0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
1e8f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e900 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
1e910 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a  texes(db) );  /*
1e920 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65   Needed for sche
1e930 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66  ma access */.  f
1e940 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
1e950 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
1e960 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
1e970 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e980 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
1e990 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
1e9a0 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
1e9b0 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
1e9c0 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
1e9d0 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
1e9e0 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
1e9f0 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
1ea00 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
1ea10 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
1ea20 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
1ea30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1ea40 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1ea50 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
1ea60 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
1ea70 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
1eaa0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
1eab0 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
1eac0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
1ead0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
1eae0 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
1eaf0 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
1eb00 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1eb10 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
1eb20 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
1eb30 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
1eb40 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
1eb50 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
1eb60 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
1eb70 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
1eb80 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
1eb90 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
1eba0 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
1ebb0 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
1ebc0 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
1ebd0 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
1ebe0 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
1ebf0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
1ec00 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
1ec10 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1ec20 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
1ec30 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1ec40 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
1ec50 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
1ec60 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1ec70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
1ec80 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
1ec90 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
1eca0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1ecb0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
1ecc0 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
1ecd0 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
1ece0 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed00 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
1ed10 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
1ed20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ed40 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1ed50 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
1ed60 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
1ed70 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
1ed80 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1ed90 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
1eda0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1edb0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
1edc0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
1edd0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1ee00 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
1ee10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1ee20 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
1ee30 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1ee40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1ee50 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
1ee60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ee70 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1ee80 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
1ee90 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
1eea0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
1eeb0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
1eec0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1eed0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
1eee0 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
1eef0 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
1ef00 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
1ef10 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
1ef20 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1ef30 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1ef40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1ef50 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
1ef60 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
1ef70 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
1ef80 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
1ef90 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
1efa0 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29  NEVER(pName2==0)
1efb0 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
1efc0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
1efd0 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oll;.    assert(
1efe0 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
1eff0 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
1f000 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
1f010 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
1f020 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
1f030 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ll ) return;.   
1f040 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1f050 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
1f060 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
1f070 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
1f080 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64  l ){.      reind
1f090 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
1f0a0 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
1f0b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f0c0 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  db, zColl);.    
1f0d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1f0e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1f0f0 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
1f100 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
1f110 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
1f120 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
1f130 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
1f140 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
1f150 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
1f160 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1f170 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b  n(db, pObjName);
1f180 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
1f190 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62  turn;.  zDb = db
1f1a0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1f1b0 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
1f1c0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
1f1d0 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  z, zDb);.  if( p
1f1e0 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  Tab ){.    reind
1f1f0 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
1f200 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  pTab, 0);.    sq
1f210 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f220 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
1f230 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
1f240 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
1f250 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
1f260 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f270 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   z);.  if( pInde
1f280 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
1f290 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1f2a0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
1f2b0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1f2c0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1f2d0 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
1f2e0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1f2f0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
1f300 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
1f310 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
1f320 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
1f330 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
1f340 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1f350 75 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20  urn a dynamicly 
1f360 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66  allocated KeyInf
1f370 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
1f380 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
1f390 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64  with OP_OpenRead
1f3a0 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65   or OP_OpenWrite
1f3b0 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62   to access datab
1f3c0 61 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  ase index pIdx..
1f3d0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1f3e0 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74  ful, a pointer t
1f3f0 6f 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74  o the new struct
1f400 75 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ure is returned.
1f410 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
1f420 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1f430 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1f440 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 44 62  alling sqlite3Db
1f450 46 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 74 68  Free(db, ) on th
1f460 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70  e returned .** p
1f470 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65 72  ointer. If an er
1f480 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74 20  ror occurs (out 
1f490 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73  of memory or mis
1f4a0 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  sing collation .
1f4b0 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e 55  ** sequence), NU
1f4c0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
1f4d0 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  nd the state of 
1f4e0 70 50 61 72 73 65 20 75 70 64 61 74 65 64 20 74  pParse updated t
1f4f0 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65  o reflect.** the
1f500 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e   error..*/.KeyIn
1f510 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78  fo *sqlite3Index
1f520 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a 70  Keyinfo(Parse *p
1f530 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
1f540 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dx){.  int i;.  
1f550 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d  int nCol = pIdx-
1f560 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 4b 65 79 49  >nColumn;.  KeyI
1f570 6e 66 6f 20 2a 70 4b 65 79 3b 0a 0a 20 20 70 4b  nfo *pKey;..  pK
1f580 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
1f590 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
1f5a0 3e 64 62 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66  >db, nCol);.  if
1f5b0 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 66 6f  ( pKey ){.    fo
1f5c0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
1f5d0 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
1f5e0 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
1f5f0 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
1f600 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b  assert( zColl );
1f610 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f  .      pKey->aCo
1f620 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c  ll[i] = sqlite3L
1f630 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
1f640 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
1f650 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
1f660 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
1f670 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
1f680 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1f690 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
1f6a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1f6b0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4b 65  (pParse->db, pKe
1f6c0 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30  y);.    pKey = 0
1f6d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1f6e0 4b 65 79 3b 0a 7d 0a                             Key;.}.