/ Hex Artifact Content
Login

Artifact ca574d33ffb1763cfd2979383f4d507095bfbe19:


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 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
10e0: 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e  >nested ) return
10f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1100: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1110: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1120: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
1130: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72  SQLITE_OK ) pPar
1140: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1150: 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
1160: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
1170: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
1180: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
1190: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
11a0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
11b0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
11c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11e0: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
11f0: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20  >isMultiWrite . 
1200: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1210: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
1220: 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61  rt(v, pParse->ma
1230: 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20  yAbort));.  if( 
1240: 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  v ){.    while( 
1250: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1260: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20  ePriorOpcode(v, 
1270: 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20 20  OP_Close) ){}.  
1280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1290: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
12a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
12b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
12c0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
12d0: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3e 30 20 26 26  >nTableLock>0 &&
12e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
12f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1300: 65 33 55 73 65 72 41 75 74 68 49 6e 69 74 28 64  e3UserAuthInit(d
1310: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  b);.      if( db
1320: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
1330: 3c 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20  <UAUTH_User ){. 
1340: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
1350: 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 5f  c = SQLITE_AUTH_
1360: 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 73 71  USER;.        sq
1370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1380: 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20  arse, "user not 
1390: 61 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b  authenticated");
13a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
13b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
13c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13d0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
13e0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
13f0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1400: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
1410: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
1420: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
1430: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
1440: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
1450: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
1460: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
1470: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
1480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1490: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
14a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
14b0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
14c0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
14d0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
14e0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
14f0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
1500: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
1510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1520: 30 20 0a 20 20 20 20 20 26 26 20 28 44 62 4d 61  0 .     && (DbMa
1530: 73 6b 4e 6f 6e 5a 65 72 6f 28 70 50 61 72 73 65  skNonZero(pParse
1540: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 20 7c 7c  ->cookieMask) ||
1550: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1560: 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  xpr).    ){.    
1570: 20 20 69 6e 74 20 69 44 62 2c 20 69 3b 0a 20 20    int iDb, i;.  
1580: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1590: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15a0: 30 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  0)->opcode==OP_I
15b0: 6e 69 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nit );.      sql
15c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15d0: 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  (v, 0);.      fo
15e0: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
15f0: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
1600: 20 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b        if( DbMask
1610: 54 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Test(pParse->coo
1620: 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
1630: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1650: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
1660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1670: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1680: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  v,.          OP_
1690: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
16c0: 20 20 20 20 20 20 20 69 44 62 2c 20 20 20 20 20         iDb,     
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
16f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44 62 4d  */.          DbM
1700: 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d 3e  askTest(pParse->
1710: 77 72 69 74 65 4d 61 73 6b 2c 69 44 62 29 2c 20  writeMask,iDb), 
1720: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20  /* P2 */.       
1730: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1740: 65 56 61 6c 75 65 5b 69 44 62 5d 2c 20 20 20 20  eValue[iDb],    
1750: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
1760: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1770: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
1780: 47 65 6e 65 72 61 74 69 6f 6e 20 20 2f 2a 20 50  Generation  /* P
1790: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 3b 0a  4 */.        );.
17a0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
17b0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 73  init.busy==0 ) s
17c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17d0: 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  P5(v, 1);.      
17e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
17f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1800: 22 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  "usesStmtJournal
1810: 3d 25 64 22 2c 20 70 50 61 72 73 65 2d 3e 6d 61  =%d", pParse->ma
1820: 79 41 62 6f 72 74 20 26 26 20 70 50 61 72 73 65  yAbort && pParse
1830: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 29 29  ->isMultiWrite))
1840: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
1850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1860: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
1880: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69  se->nVtabLock; i
1890: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
18a0: 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20  r *vtab = (char 
18b0: 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
18c0: 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  le(db, pParse->a
18d0: 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20  pVtabLock[i]);. 
18e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18f0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
1900: 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  Begin, 0, 0, 0, 
1910: 76 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  vtab, P4_VTAB);.
1920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1930: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1940: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
1950: 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74     /* Once all t
1960: 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20  he cookies have 
1970: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e  been verified an
1980: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  d transactions o
1990: 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a  pened, .      **
19a0: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
19b0: 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73  ired table-locks
19c0: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
19d0: 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20  p unless the .  
19e0: 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61      ** shared-ca
19f0: 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
1a00: 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  nabled..      */
1a10: 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65  .      codeTable
1a20: 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 0a  Locks(pParse);..
1a30: 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
1a40: 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43 52  ize any AUTOINCR
1a50: 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75 63  EMENT data struc
1a60: 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e 0a  tures required..
1a70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1a80: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
1a90: 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65 29  entBegin(pParse)
1aa0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
1ab0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
1ac0: 73 69 6f 6e 73 20 74 68 61 74 20 77 68 65 72 65  sions that where
1ad0: 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 6f 66   factored out of
1ae0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
1af0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1b00: 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 29 7b 0a  ->pConstExpr ){.
1b10: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
1b20: 20 2a 70 45 4c 20 3d 20 70 50 61 72 73 65 2d 3e   *pEL = pParse->
1b30: 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20  pConstExpr;.    
1b40: 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f      pParse->okCo
1b50: 6e 73 74 46 61 63 74 6f 72 20 3d 20 30 3b 0a 20  nstFactor = 0;. 
1b60: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1b70: 69 3c 70 45 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b  i<pEL->nExpr; i+
1b80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1b90: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1ba0: 61 72 73 65 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e  arse, pEL->a[i].
1bb0: 70 45 78 70 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d  pExpr, pEL->a[i]
1bc0: 2e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  .u.iConstExprReg
1bd0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1be0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
1bf0: 69 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63  inally, jump bac
1c00: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
1c10: 6e 67 20 6f 66 20 74 68 65 20 65 78 65 63 75 74  ng of the execut
1c20: 61 62 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20  able code. */.  
1c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1c40: 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 7d  oto(v, 1);.    }
1c50: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20  .  }...  /* Get 
1c60: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1c70: 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75   ready for execu
1c80: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
1c90: 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  v && pParse->nEr
1ca0: 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c  r==0 && !db->mal
1cb0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1cc0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1cd0: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20  >iCacheLevel==0 
1ce0: 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20  );  /* Disables 
1cf0: 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d  and re-enables m
1d00: 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20 41  atch */.    /* A
1d10: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   minimum of one 
1d20: 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69 72  cursor is requir
1d30: 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65 6d  ed if autoincrem
1d40: 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20 20  ent is used.    
1d50: 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 61  *  See ticket [a
1d60: 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d 20  696379c1f08866] 
1d70: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  */.    if( pPars
1d80: 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20 70  e->pAinc!=0 && p
1d90: 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20 29  Parse->nTab==0 )
1da0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
1db0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
1dc0: 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70  beMakeReady(v, p
1dd0: 50 61 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72  Parse);.    pPar
1de0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1df0: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
1e00: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
1e10: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1e20: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1e30: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1e40: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
1e50: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  0;.  pParse->nMe
1e60: 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  m = 0;.  pParse-
1e70: 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61  >nSet = 0;.  pPa
1e80: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20  rse->nVar = 0;. 
1e90: 20 44 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72   DbMaskZero(pPar
1ea0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b  se->cookieMask);
1eb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
1ec0: 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64  e parser and cod
1ed0: 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75  e generator recu
1ee0: 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72  rsively in order
1ef0: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
1f00: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c  code for the SQL
1f10: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
1f20: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
1f30: 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74   the pParse cont
1f40: 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ext.** currently
1f50: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1f60: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70  ion.  When the p
1f70: 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63  arser is run rec
1f80: 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73  ursively.** this
1f90: 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20   way, the final 
1fa0: 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61  OP_Halt is not a
1fb0: 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65  ppended and othe
1fc0: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
1fd0: 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61  .** and finaliza
1fe0: 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f  tion steps are o
1ff0: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74  mitted because t
2000: 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e  hose are handlin
2010: 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65  g by the.** oute
2020: 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a  rmost parser..**
2030: 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69  .** Not everythi
2040: 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20  ng is nestable. 
2050: 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69   This facility i
2060: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65  s designed to pe
2070: 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20  rmit.** INSERT, 
2080: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
2090: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67  TE operations ag
20a0: 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53  ainst SQLITE_MAS
20b0: 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72  TER.  Use.** car
20c0: 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20  e if you decide 
20d0: 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  to try to use th
20e0: 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  is routine for s
20f0: 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
2100: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2110: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50  te3NestedParse(P
2120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
2130: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
2140: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
2150: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
2160: 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Sql;.  char *zEr
2170: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rMsg = 0;.  sqli
2180: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2190: 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53  ->db;.# define S
21a0: 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28  AVE_SZ  (sizeof(
21b0: 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f  Parse) - offseto
21c0: 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20  f(Parse,nVar)). 
21d0: 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41   char saveBuf[SA
21e0: 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70  VE_SZ];..  if( p
21f0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
2200: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
2210: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31  pParse->nested<1
2220: 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67  0 );  /* Nesting
2230: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2240: 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68  of limited depth
2250: 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61   */.  va_start(a
2260: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
2270: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  Sql = sqlite3VMP
2280: 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61  rintf(db, zForma
2290: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
22a0: 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  (ap);.  if( zSql
22b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
22c0: 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  n;   /* A malloc
22d0: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
22e0: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73  d */.  }.  pPars
22f0: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
2300: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26  emcpy(saveBuf, &
2310: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41  pParse->nVar, SA
2320: 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  VE_SZ);.  memset
2330: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
2340: 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73  0, SAVE_SZ);.  s
2350: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
2360: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
2370: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2380: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2390: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
23a0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
23b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72  ;.  memcpy(&pPar
23c0: 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75  se->nVar, saveBu
23d0: 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70  f, SAVE_SZ);.  p
23e0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b  Parse->nested--;
23f0: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  .}..#if SQLITE_U
2400: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2410: 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ON./*.** Return 
2420: 54 52 55 45 20 69 66 20 7a 54 61 62 6c 65 20 69  TRUE if zTable i
2430: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
2440: 65 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20 74  e system table t
2450: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 0a 2a  hat stores the.*
2460: 2a 20 6c 69 73 74 20 6f 66 20 75 73 65 72 73 20  * list of users 
2470: 61 6e 64 20 74 68 65 69 72 20 61 63 63 65 73 73  and their access
2480: 20 63 72 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f   credentials..*/
2490: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 73 65 72  .int sqlite3User
24a0: 41 75 74 68 54 61 62 6c 65 28 63 6f 6e 73 74 20  AuthTable(const 
24b0: 63 68 61 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20  char *zTable){. 
24c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
24d0: 73 74 72 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20  stricmp(zTable, 
24e0: 22 73 71 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d  "sqlite_user")==
24f0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
2500: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2510: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2520: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2530: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2540: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
2550: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2560: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
2570: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
2580: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
2590: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
25a0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
25b0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
25c0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
25d0: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
25e0: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
25f0: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
2600: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
2610: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
2620: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20  tching table is 
2630: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
2640: 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c  hecking for dupl
2650: 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  icate table.** n
2660: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
2670: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
2680: 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20   is TEMP first, 
2690: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
26a0: 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  any.** auxiliary
26b0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
26c0: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
26d0: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  H command..**.**
26e0: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
26f0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a  3LocateTable()..
2700: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2710: 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74  3FindTable(sqlit
2720: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2730: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
2740: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
2750: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
2760: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
2770: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2780: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2790: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
27a0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
27b0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
27c0: 72 74 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  rt( zDatabase!=0
27d0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
27e0: 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
27f0: 64 62 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  db) );.#if SQLIT
2800: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2810: 41 54 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ATION.  /* Only 
2820: 74 68 65 20 61 64 6d 69 6e 20 75 73 65 72 20 69  the admin user i
2830: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f  s allowed to kno
2840: 77 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  w that the sqlit
2850: 65 5f 75 73 65 72 20 74 61 62 6c 65 0a 20 20 2a  e_user table.  *
2860: 2a 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66  * exists */.  if
2870: 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c  ( db->auth.authL
2880: 65 76 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e  evel<UAUTH_Admin
2890: 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 72 41   && sqlite3UserA
28a0: 75 74 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21  uthTable(zName)!
28b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
28c0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
28d0: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
28e0: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
28f0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2900: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2910: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2920: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2930: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2940: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2950: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2960: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
2970: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
2980: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
2990: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
29a0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
29b0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
29c0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
29d0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
29e0: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  blHash, zName);.
29f0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
2a00: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2a10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
2a20: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2a30: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2a40: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2a50: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2a60: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2a70: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2a80: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2a90: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2aa0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2ab0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
2ac0: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2ad0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2ae0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2af0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2b00: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2b10: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2b20: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2b30: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2b40: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2b50: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2b60: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2b70: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2b80: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2b90: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2ba0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2bb0: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
2bc0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2bd0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a  te3LocateTable(.
2be0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
2c00: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ext in which to 
2c10: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f  report errors */
2c20: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
2c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2c40: 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  e if looking for
2c50: 20 61 20 56 49 45 57 20 72 61 74 68 65 72 20 74   a VIEW rather t
2c60: 68 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20  han a TABLE */. 
2c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2c80: 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
2c90: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
2ca0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  are looking for 
2cb0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2cc0: 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e  *zDbase     /* N
2cd0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2ce0: 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ase.  Might be N
2cf0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ULL */.){.  Tabl
2d00: 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  e *p;..  /* Read
2d10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2d20: 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
2d30: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
2d40: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2d50: 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
2d60: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
2d70: 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
2d80: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
2d90: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
2da0: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
2db0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2dc0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  p = sqlite3FindT
2dd0: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
2de0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
2df0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2e00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2e10: 4d 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22  Msg = isView ? "
2e20: 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20  no such view" : 
2e30: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b  "no such table";
2e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e50: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2e60: 45 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  E.    if( sqlite
2e70: 33 46 69 6e 64 44 62 4e 61 6d 65 28 70 50 61 72  3FindDbName(pPar
2e80: 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73 65 29 3c  se->db, zDbase)<
2e90: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
2ea0: 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 6f   zName is the no
2eb0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
2ec0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68  table in the sch
2ed0: 65 6d 61 20 63 72 65 61 74 65 64 20 75 73 69 6e  ema created usin
2ee0: 67 0a 20 20 20 20 20 20 2a 2a 20 43 52 45 41 54  g.      ** CREAT
2ef0: 45 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  E, then check to
2f00: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 74 68   see if it is th
2f10: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 76 69 72  e name of an vir
2f20: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 0a  tual table that.
2f30: 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
2f40: 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
2f50: 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  tual table. */. 
2f60: 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f       Module *pMo
2f70: 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c  d = (Module*)sql
2f80: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 50  ite3HashFind(&pP
2f90: 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f 64 75 6c  arse->db->aModul
2fa0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
2fb0: 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c   if( pMod && sql
2fc0: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
2fd0: 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73  sTableInit(pPars
2fe0: 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20  e, pMod) ){.    
2ff0: 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d      return pMod-
3000: 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20  >pEpoTab;.      
3010: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
3020: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3040: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3050: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
3060: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
3070: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3080: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3090: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
30a0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65  %s", zMsg, zName
30b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
30c0: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
30d0: 20 3d 20 31 3b 0a 20 20 7d 0a 23 69 66 20 53 51   = 1;.  }.#if SQ
30e0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
30f0: 54 49 43 41 54 49 4f 4e 0a 20 20 65 6c 73 65 20  TICATION.  else 
3100: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
3110: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55  auth.authLevel<U
3120: 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20  AUTH_User ){.   
3130: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3140: 28 70 50 61 72 73 65 2c 20 22 75 73 65 72 20 6e  (pParse, "user n
3150: 6f 74 20 61 75 74 68 65 6e 74 69 63 61 74 65 64  ot authenticated
3160: 22 29 3b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20  ");.    p = 0;. 
3170: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
3180: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
3190: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
31a0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70  identified by *p
31b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
31c0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
31d0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
31e0: 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65  ble(). The diffe
31f0: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a  rence between.**
3200: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3210: 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66  ble() and this f
3220: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20  unction is that 
3230: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
3240: 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73  stricts.** the s
3250: 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20  earch to schema 
3260: 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20  (p->pSchema) if 
3270: 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20  it is not NULL. 
3280: 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62  p->pSchema may b
3290: 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e.** non-NULL if
32a0: 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61   it is part of a
32b0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
32c0: 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74   program definit
32d0: 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69  ion. See.** sqli
32e0: 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20  te3FixSrcList() 
32f0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
3300: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
3310: 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20  cateTableItem(. 
3320: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3330: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 0a  .  int isView, .
3340: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3350: 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f  _item *p.){.  co
3360: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
3370: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
3380: 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61  ema==0 || p->zDa
3390: 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69  tabase==0 );.  i
33a0: 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b  f( p->pSchema ){
33b0: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
33c0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
33d0: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
33e0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  p->pSchema);.   
33f0: 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   zDb = pParse->d
3400: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
3410: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3420: 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61  zDb = p->zDataba
3430: 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  se;.  }.  return
3440: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3450: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56 69  ble(pParse, isVi
3460: 65 77 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  ew, p->zName, zD
3470: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  b);.}../*.** Loc
3480: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
3490: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
34a0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
34b0: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
34c0: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
34d0: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
34e0: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
34f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
3500: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
3510: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
3520: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
3530: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
3540: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
3550: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
3560: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
3570: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
3580: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
3590: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
35a0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
35b0: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
35c0: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
35d0: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
35e0: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
35f0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
3600: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
3610: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3620: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
3630: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
3640: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
3650: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
3660: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3680: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
3690: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
36a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
36b0: 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61  /* All mutexes a
36c0: 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  re required for 
36d0: 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20  schema access.  
36e0: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c  Make sure we hol
36f0: 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73  d them. */.  ass
3700: 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73  ert( zDb!=0 || s
3710: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3720: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
3730: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
3740: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
3750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
3760: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
3770: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
3780: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
3790: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
37a0: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
37b0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
37c0: 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d    assert( pSchem
37d0: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  a );.    if( zDb
37e0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
37f0: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
3800: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
3810: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
3820: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
3830: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20  utexHeld(db, j, 
3840: 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  0) );.    p = sq
3850: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
3860: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
3870: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
3880: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
3890: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
38a0: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
38b0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
38c0: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
38d0: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
38e0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  x(sqlite3 *db, I
38f0: 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65  ndex *p){.#ifnde
3900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
3910: 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44  ALYZE.  sqlite3D
3920: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
3930: 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66  s(db, p);.#endif
3940: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3950: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72  lete(db, p->pPar
3960: 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73 71  tIdxWhere);.  sq
3970: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3980: 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 45  ete(db, p->aColE
3990: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  xpr);.  sqlite3D
39a0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f  bFree(db, p->zCo
39b0: 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lAff);.  if( p->
39c0: 69 73 52 65 73 69 7a 65 64 20 29 20 73 71 6c 69  isResized ) sqli
39d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39e0: 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66  >azColl);.#ifdef
39f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3a00: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
3a10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
3a20: 61 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69  aiRowEst);.#endi
3a30: 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
3a40: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
3a50: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
3a60: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
3a70: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
3a80: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3a90: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
3aa0: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
3ab0: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
3ac0: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
3ad0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
3ae0: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
3af0: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
3b00: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
3b10: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
3b20: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
3b30: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3b40: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
3b50: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3b60: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3b70: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
3b80: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73  x *pIndex;.  Has
3b90: 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73  h *pHash;..  ass
3ba0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3bb0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3bc0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61  iDb, 0) );.  pHa
3bd0: 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  sh = &db->aDb[iD
3be0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
3bf0: 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  ash;.  pIndex = 
3c00: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
3c10: 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d  t(pHash, zIdxNam
3c20: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57  e, 0);.  if( ALW
3c30: 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20  AYS(pIndex) ){. 
3c40: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70     if( pIndex->p
3c50: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70  Table->pIndex==p
3c60: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
3c70: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
3c80: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e  Index = pIndex->
3c90: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
3ca0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
3cb0: 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69  ;.      /* Justi
3cc0: 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41  fication of ALWA
3cd0: 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78  YS();  The index
3ce0: 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20   must be on the 
3cf0: 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  list of.      **
3d00: 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20   indices. */.   
3d10: 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70     p = pIndex->p
3d20: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20  Table->pIndex;. 
3d30: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
3d40: 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78  YS(p) && p->pNex
3d50: 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d  t!=pIndex ){ p =
3d60: 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20   p->pNext; }.   
3d70: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20     if( ALWAYS(p 
3d80: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
3d90: 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dex) ){.        
3da0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
3db0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
3dc0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
3dd0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
3de0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
3df0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
3e00: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3e10: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67  *.** Look throug
3e20: 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70  h the list of op
3e30: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
3e40: 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61  s in db->aDb[] a
3e50: 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76  nd if.** any hav
3e60: 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72  e been closed, r
3e70: 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
3e80: 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c  the list.  Reall
3e90: 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d  ocate the.** db-
3ea0: 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65  >aDb[] structure
3eb0: 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69   to a smaller si
3ec0: 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  ze, if possible.
3ed0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28  .**.** Entry 0 (
3ee0: 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62  the "main" datab
3ef0: 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31  ase) and entry 1
3f00: 20 28 74 68 65 20 22 74 65 6d 70 22 20 64 61 74   (the "temp" dat
3f10: 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65  abase).** are ne
3f20: 76 65 72 20 63 61 6e 64 69 64 61 74 65 73 20 66  ver candidates f
3f30: 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73  or being collaps
3f40: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3f50: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
3f60: 61 73 65 41 72 72 61 79 28 73 71 6c 69 74 65 33  aseArray(sqlite3
3f70: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20   *db){.  int i, 
3f80: 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20  j;.  for(i=j=2; 
3f90: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3fa0: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
3fb0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
3fc0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
3fd0: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
3fe0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3ff0: 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  , pDb->zName);. 
4000: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20       pDb->zName 
4010: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
4020: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
4030: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
4040: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
4050: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
4060: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65     j++;.  }.  me
4070: 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  mset(&db->aDb[j]
4080: 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29  , 0, (db->nDb-j)
4090: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
40a0: 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  j]));.  db->nDb 
40b0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
40c0: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
40d0: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
40e0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
40f0: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
4100: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
4110: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
4120: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4130: 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  b, db->aDb);.   
4140: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
4150: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
4160: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
4170: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
4180: 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65  database at inde
4190: 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73  x iDb.  Also res
41a0: 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73  et the.** TEMP s
41b0: 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73  chema..*/.void s
41c0: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63  qlite3ResetOneSc
41d0: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
41e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 44 62  , int iDb){.  Db
41f0: 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *pDb;.  assert(
4200: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
4210: 0a 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 52  .  /* Case 1:  R
4220: 65 73 65 74 20 74 68 65 20 73 69 6e 67 6c 65 20  eset the single 
4230: 73 63 68 65 6d 61 20 69 64 65 6e 74 69 66 69 65  schema identifie
4240: 64 20 62 79 20 69 44 62 20 2a 2f 0a 20 20 70 44  d by iDb */.  pD
4250: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
4260: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ];.  assert( sql
4270: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4280: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
4290: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
42a0: 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  ->pSchema!=0 );.
42b0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
42c0: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
42d0: 61 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79  a);..  /* If any
42e0: 20 64 61 74 61 62 61 73 65 20 6f 74 68 65 72 20   database other 
42f0: 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72 65 73  than TEMP is res
4300: 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20 72 65  et, then also re
4310: 73 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69  set TEMP.  ** si
4320: 6e 63 65 20 54 45 4d 50 20 6d 69 67 68 74 20 62  nce TEMP might b
4330: 65 20 68 6f 6c 64 69 6e 67 20 74 72 69 67 67 65  e holding trigge
4340: 72 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  rs that referenc
4350: 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a  e tables in the.
4360: 20 20 2a 2a 20 6f 74 68 65 72 20 64 61 74 61 62    ** other datab
4370: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
4380: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 70 44  iDb!=1 ){.    pD
4390: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b  b = &db->aDb[1];
43a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
43b0: 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  ->pSchema!=0 );.
43c0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
43d0: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
43e0: 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ema);.  }.  retu
43f0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rn;.}../*.** Era
4400: 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e  se all schema in
4410: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
4420: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
4430: 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bases (including
4440: 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22  .** "main" and "
4450: 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e  temp") for a sin
4460: 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  gle database con
4470: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
4480: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
4490: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
44a0: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ion(sqlite3 *db)
44b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
44c0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
44d0: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
44e0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
44f0: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
4500: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
4510: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
4520: 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
4530: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
4540: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
4550: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c    }.  }.  db->fl
4560: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
4570: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
4580: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
4590: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
45a0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
45b0: 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  l(db);.  sqlite3
45c0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
45d0: 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  Array(db);.}../*
45e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
45f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4600: 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e  a commit occurs.
4610: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4620: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
4630: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
4640: 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  b){.  db->flags 
4650: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
4660: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
4670: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4680: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
4690: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
46a0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
46b0: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
46c0: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
46d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
46e0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
46f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4700: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4710: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
4720: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
4730: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
4740: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
4750: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
4760: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4770: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4780: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
4790: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47a0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
47b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
47c0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
47d0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
47e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47f0: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
4800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4810: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
4820: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Type);.      sql
4830: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4840: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
4850: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
4860: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4870: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >aCol);.  }.}../
4880: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
4890: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
48a0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
48b0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
48c0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
48d0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
48e0: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
48f0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
4900: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
4910: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
4920: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
4930: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
4940: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
4950: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
4960: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
4970: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
4980: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
4990: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
49a0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
49b0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
49c0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
49d0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
49e0: 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65   The db paramete
49f0: 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  r is optional.  
4a00: 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20  It is needed if 
4a10: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
4a20: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f   .** contains lo
4a30: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20  okaside memory. 
4a40: 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20   (Table objects 
4a50: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f  in the schema do
4a60: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b   not use.** look
4a70: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75  aside memory, bu
4a80: 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c  t some ephemeral
4a90: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64   Table objects d
4aa0: 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64  o.)  Or the.** d
4ab0: 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20  b parameter can 
4ac0: 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d  be used with db-
4ad0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f  >pnBytesFreed to
4ae0: 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d   measure the mem
4af0: 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  ory.** used by t
4b00: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e  he Table object.
4b10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4b20: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4b30: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
4b40: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
4b50: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
4b60: 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ;.  TESTONLY( in
4b70: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20  t nLookaside; ) 
4b80: 2f 2a 20 55 73 65 64 20 74 6f 20 76 65 72 69 66  /* Used to verif
4b90: 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20  y lookaside not 
4ba0: 75 73 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  used for schema 
4bb0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  */..  assert( !p
4bc0: 54 61 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d  Table || pTable-
4bd0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a  >nRef>0 );..  /*
4be0: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
4bf0: 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74  he table until t
4c00: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
4c10: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
4c20: 20 2a 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c   */.  if( !pTabl
4c30: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  e ) return;.  if
4c40: 28 20 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70  ( ((!db || db->p
4c50: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20  nBytesFreed==0) 
4c60: 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52  && (--pTable->nR
4c70: 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b  ef)>0) ) return;
4c80: 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
4c90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  e number of outs
4ca0: 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  tanding lookasid
4cb0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e  e allocations in
4cc0: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20   schema Tables. 
4cd0: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69   ** prior to doi
4ce0: 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70  ng any free() op
4cf0: 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65  erations.  Since
4d00: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64   schema Tables d
4d10: 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c  o not use.  ** l
4d20: 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e  ookaside, this n
4d30: 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  umber should not
4d40: 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45   change. */.  TE
4d50: 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69  STONLY( nLookasi
4d60: 64 65 20 3d 20 28 64 62 20 26 26 20 28 70 54 61  de = (db && (pTa
4d70: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ble->tabFlags & 
4d80: 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
4d90: 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ?.            
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
4db0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4dc0: 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  : 0 );..  /* Del
4dd0: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
4de0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4df0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
4e00: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
4e10: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
4e20: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
4e30: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
4e40: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
4e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
4e60: 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  ex->pSchema==pTa
4e70: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  ble->pSchema );.
4e80: 20 20 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64      if( !db || d
4e90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
4eb0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78   *zName = pIndex
4ec0: 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20  ->zName; .      
4ed0: 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78  TESTONLY ( Index
4ee0: 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74   *pOld = ) sqlit
4ef0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20  e3HashInsert(.  
4f00: 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e         &pIndex->
4f10: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
4f20: 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20  , zName, 0.     
4f30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4f40: 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ( db==0 || sqlit
4f50: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
4f60: 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
4f70: 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
4f80: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d     assert( pOld=
4f90: 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d  =pIndex || pOld=
4fa0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
4fb0: 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
4fc0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
4fd0: 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72 65   Delete any fore
4fe0: 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68 65  ign keys attache
4ff0: 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2e  d to this table.
5000: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b 44   */.  sqlite3FkD
5010: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
5020: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
5030: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
5040: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
5050: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
5060: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
5070: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
5080: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5090: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
50a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
50b0: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
50c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
50d0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  ctDelete(db, pTa
50e0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
50f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5100: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
5110: 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66 6e  e->pCheck);.#ifn
5120: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5130: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
5140: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
5150: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65 6e  db, pTable);.#en
5160: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
5170: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ree(db, pTable);
5180: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ..  /* Verify th
5190: 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65 20  at no lookaside 
51a0: 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64 20  memory was used 
51b0: 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  by schema tables
51c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4c   */.  assert( nL
51d0: 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20 6e  ookaside==0 || n
51e0: 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e 6c  Lookaside==db->l
51f0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 3b  ookaside.nOut );
5200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
5210: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
5220: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
5230: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
5240: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
5250: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
5260: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
5270: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
5280: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
5290: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
52a0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
52b0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
52c0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
52d0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
52e0: 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
52f0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
5300: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
5310: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
5320: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  ;.  assert( zTab
5330: 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Name );.  assert
5340: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
5350: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
5360: 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74 63 61  , 0) );.  testca
5370: 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d  se( zTabName[0]=
5380: 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c  =0 );  /* Zero-l
5390: 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61 6d 65  ength table name
53a0: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  s are allowed */
53b0: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
53c0: 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71  b[iDb];.  p = sq
53d0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
53e0: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
53f0: 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65  blHash, zTabName
5400: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , 0);.  sqlite3D
5410: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5420: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  );.  db->flags |
5430: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
5440: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
5450: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
5460: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
5470: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
5480: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
5490: 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61  t.** token.  Spa
54a0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
54b0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
54c0: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
54d0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
54e0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
54f0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
5500: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
5510: 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74  **.** Any quotat
5520: 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20  ion marks (ex:  
5530: 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20  "name", 'name', 
5540: 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65  [name], or `name
5550: 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f  `) that.** surro
5560: 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20  und the body of 
5570: 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65  the token are re
5580: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  moved..**.** Tok
5590: 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75  ens are often ju
55a0: 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f  st pointers into
55b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
55c0: 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a  L text and so.**
55d0: 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65   are not \000 te
55e0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65  rminated and are
55f0: 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e   not persistent.
5600: 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73    The returned s
5610: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30  tring.** is \000
5620: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
5630: 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
5640: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e  /.char *sqlite3N
5650: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c  ameFromToken(sql
5660: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
5670: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
5680: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e  *zName;.  if( pN
5690: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
56a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
56b0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
56c0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
56d0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
56e0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
56f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
5700: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
5710: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
5720: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
5730: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
5740: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
5750: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
5760: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
5770: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
5780: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
5790: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
57a0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
57b0: 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20  e(Parse *p, int 
57c0: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
57d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
57e0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61  (p);.  sqlite3Ta
57f0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20  bleLock(p, iDb, 
5800: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
5810: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
5820: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
5830: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
5840: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d  _OpenWrite, 0, M
5850: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 2c  ASTER_ROOT, iDb,
5860: 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54   5);.  if( p->nT
5870: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ab==0 ){.    p->
5880: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  nTab = 1;.  }.}.
5890: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
58a0: 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f   zName points to
58b0: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
58c0: 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  d buffer contain
58d0: 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20  ing the name.** 
58e0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 22  of a database ("
58f0: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72  main", "temp" or
5900: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
5910: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
5920: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
5930: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78  eturns the index
5940: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
5950: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
5960: 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66  b[], or.** -1 if
5970: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61   the named db ca
5980: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
5990: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
59a0: 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20  dDbName(sqlite3 
59b0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
59c0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
59d0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
59e0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
59f0: 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65  r */.  if( zName
5a00: 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b   ){.    Db *pDb;
5a10: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c  .    int n = sql
5a20: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
5a30: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  me);.    for(i=(
5a40: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5a50: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5a60: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5a70: 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54        if( (!OMIT
5a80: 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20  _TEMPDB || i!=1 
5a90: 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53  ) && n==sqlite3S
5aa0: 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61  trlen30(pDb->zNa
5ab0: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
5ac0: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
5ad0: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
5ae0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
5af0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5b10: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
5b20: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
5b30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
5b40: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
5b50: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
5b60: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
5b70: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
5b80: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
5b90: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
5ba0: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
5bb0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
5bc0: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
5bd0: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
5be0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
5bf0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
5c00: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
5c10: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
5c20: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
5c30: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5c60: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
5c70: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
5ca0: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
5cb0: 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
5cc0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5cd0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
5ce0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
5cf0: 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Name(db, zName);
5d00: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5d10: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
5d20: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54  eturn i;.}../* T
5d30: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5d40: 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65   or trigger name
5d50: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
5d60: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
5d70: 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20  okens.** pName1 
5d80: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
5d90: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
5da0: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5db0: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5dc0: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5dd0: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
5de0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e  ;.** .** Then pN
5df0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5e00: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
5e10: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5e20: 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74  her hand if.** t
5e30: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
5e40: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
5e50: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a  fied, i.e.:.**.*
5e60: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5e70: 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  yy(...);.**.** T
5e80: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5e90: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
5ea0: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a  Name2 is ""..**.
5eb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5ec0: 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75  sets the *ppUnqu
5ed0: 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  al pointer to po
5ee0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
5ef0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70   (pName1 or.** p
5f00: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
5f10: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
5f20: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ed table name.  
5f30: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
5f40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78  .** database "xx
5f50: 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  x" is returned..
5f60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77  */.int sqlite3Tw
5f70: 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72  oPartName(.  Par
5f80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5f90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5fa0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5fb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
5fc0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
5fd0: 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e   /* The "xxx" in
5fe0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5ff0: 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a  yy" or "xxx" */.
6000: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
6010: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79        /* The "yy
6020: 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  y" in the name "
6030: 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f  xxx.yyy" */.  To
6040: 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20  ken **pUnqual   
6050: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
6060: 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63  nqualified objec
6070: 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29  t name here */.)
6080: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
60b0: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  ing the object *
60c0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
60d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
60e0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4e 61 6d   if( ALWAYS(pNam
60f0: 65 32 21 3d 30 29 20 26 26 20 70 4e 61 6d 65 32  e2!=0) && pName2
6100: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ->n>0 ){.    if(
6110: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
6120: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6130: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6140: 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61   "corrupt databa
6150: 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  se");.      retu
6160: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
6170: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6180: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
6190: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
61a0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
61b0: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
61c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
61d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
61e0: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
61f0: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65  Name1);.      re
6200: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
6210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6220: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
6230: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
6240: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
6250: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
6260: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
6270: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
6280: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
6290: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
62a0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
62b0: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
62c0: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
62d0: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
62e0: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
62f0: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
6300: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
6310: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
6320: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
6330: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
6340: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
6350: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
6360: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
6370: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
6380: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
6390: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
63a0: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
63b0: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
63c0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
63d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
63e0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
63f0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
6400: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
6410: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
6420: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
6430: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
6440: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
6450: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
6460: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
6470: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
6480: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
6490: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
64a0: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
64b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
64c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
64d0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
64e0: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
64f0: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
6500: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
6510: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
6520: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6530: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6540: 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59  turn the PRIMARY
6550: 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20   KEY index of a 
6560: 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a  table.*/.Index *
6570: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
6580: 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  yIndex(Table *pT
6590: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  ab){.  Index *p;
65a0: 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70  .  for(p=pTab->p
65b0: 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50  Index; p && !IsP
65c0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
65d0: 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  ); p=p->pNext){}
65e0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
65f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6600: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
6610: 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65   pIdx that corre
6620: 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a  sponds to table.
6630: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20  ** column iCol. 
6640: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f   Return -1 if no
6650: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20  t found..*/.i16 
6660: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
6670: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
6680: 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69  , i16 iCol){.  i
6690: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
66a0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
66b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
66c0: 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  iCol==pIdx->aiCo
66d0: 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e  lumn[i] ) return
66e0: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
66f0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   -1;.}../*.** Be
6700: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
6710: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
6720: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
6730: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
6740: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
6750: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
6760: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
6770: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
6780: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
6790: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
67a0: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
67b0: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
67c0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
67d0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
67e0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
67f0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
6800: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
6810: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
6820: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
6830: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
6840: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
6850: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
6860: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
6870: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6880: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
6890: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
68a0: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
68b0: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
68c0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
68d0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
68e0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
68f0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
6900: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6910: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
6920: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
6930: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
6940: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
6950: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6960: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
6970: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
6980: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
6990: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
69a0: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
69b0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
69c0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
69d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
69e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
69f0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
6a00: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
6a10: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
6a20: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
6a30: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
6a40: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
6a50: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
6a60: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
6a70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6a80: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
6a90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
6aa0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
6ab0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
6ac0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6ad0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
6ae0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
6af0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
6b00: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6b10: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6b20: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
6b30: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
6b40: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
6b50: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
6b60: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
6b70: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6b80: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
6b90: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
6ba0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6bb0: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
6bc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
6bd0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
6be0: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
6bf0: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
6c00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
6c10: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
6c20: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
6c30: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
6c40: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
6c50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6c60: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
6c70: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6c80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
6c90: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
6ca0: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
6cb0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
6cc0: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
6cd0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6ce0: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
6cf0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
6d00: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
6d10: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
6d20: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
6d30: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
6d40: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
6d50: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
6d60: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
6d70: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
6d80: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
6d90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
6da0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
6db0: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
6dc0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
6dd0: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
6de0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
6df0: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
6e00: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
6e10: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
6e20: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
6e30: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
6e40: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
6e50: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
6e60: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
6e70: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
6e80: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
6e90: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
6ea0: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
6eb0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
6ec0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
6ed0: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
6ee0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
6ef0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
6f00: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
6f10: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
6f20: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
6f30: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
6f40: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
6f50: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
6f60: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
6f70: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
6f80: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
6f90: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
6fa0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
6fb0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
6fc0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6fd0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6fe0: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e   && isTemp && pN
6ff0: 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62  ame2->n>0 && iDb
7000: 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  !=1 ){.    /* If
7010: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
7020: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
7030: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
7040: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
7050: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
7060: 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70  se name is "temp
7070: 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20  " anyway.  */.  
7080: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7090: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
70a0: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
70b0: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
70c0: 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ied");.    retur
70d0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d  n;.  }.  if( !OM
70e0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
70f0: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a  emp ) iDb = 1;..
7100: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
7110: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
7120: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7130: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
7140: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
7150: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
7160: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
7170: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
7180: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
7190: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
71a0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
71b0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
71c0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
71d0: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
71e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
71f0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
7200: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
7210: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
7220: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
7230: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
7240: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
7250: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
7260: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
7270: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
7280: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
7290: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
72a0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
72b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
72c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
72d0: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
72e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
72f0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
7300: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
7310: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
7320: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
7330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7340: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
7350: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
7360: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7370: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
7380: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
7390: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
73a0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
73b0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
73c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
73d0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
73e0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
73f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7400: 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20   if( !isVirtual 
7410: 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  && sqlite3AuthCh
7420: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
7430: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
7440: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7450: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7460: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7470: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
7480: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
7490: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
74a0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
74b0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
74c0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
74d0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
74e0: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
74f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
7500: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
7510: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
7520: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
7530: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
7540: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
7550: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
7560: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
7570: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
7580: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
7590: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
75a0: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
75b0: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
75c0: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
75d0: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
75e0: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
75f0: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
7600: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
7610: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
7620: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
7630: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7640: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
7650: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
7660: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7670: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7680: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
7690: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
76a0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
76b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
76c0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
76d0: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
76e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
76f0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
7700: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
7710: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
7720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7730: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
7740: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
7750: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
7760: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7770: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
7780: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
7790: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
77a0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
77b0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
77c0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
77d0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
77e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
77f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7800: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
7810: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
7820: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
7830: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7840: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7850: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
7860: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7870: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
7880: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
7890: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
78a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
78b0: 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73  d = 1;.    pPars
78c0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
78d0: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
78e0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
78f0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7900: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
7910: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
7920: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
7930: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
7940: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
7950: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
7960: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  a;.  pTable->nRe
7970: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d  f = 1;.  pTable-
7980: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
7990: 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
79a0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
79b0: 34 38 35 37 36 29 20 29 3b 0a 20 20 61 73 73 65  48576) );.  asse
79c0: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
79d0: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50  Table==0 );.  pP
79e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
79f0: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
7a00: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
7a10: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
7a20: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
7a30: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
7a40: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
7a50: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
7a60: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
7a70: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7a80: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
7a90: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
7aa0: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
7ab0: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
7ac0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7ad0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
7ae0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
7af0: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
7b00: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
7b10: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
7b20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
7b30: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
7b40: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
7b50: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  ;.    pTable->pS
7b60: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
7b70: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
7b80: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
7b90: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
7ba0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
7bb0: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
7bc0: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
7bd0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
7be0: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
7bf0: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
7c00: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
7c10: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
7c20: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
7c30: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7c40: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
7c50: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
7c60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
7c70: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
7c80: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
7c90: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
7ca0: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
7cb0: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
7cc0: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
7cd0: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
7ce0: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
7cf0: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
7d00: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
7d10: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
7d20: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
7d30: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
7d40: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
7d50: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
7d60: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
7d70: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
7d80: 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20     int addr1;.  
7d90: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
7da0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
7db0: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
7dc0: 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20  /* nullRow[] is 
7dd0: 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63  an OP_Record enc
7de0: 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63  oding of a row c
7df0: 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c  ontaining 5 NULL
7e00: 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  s */.    static 
7e10: 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52  const char nullR
7e20: 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30  ow[] = { 6, 0, 0
7e30: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
7e40: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
7e50: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
7e60: 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
7e70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7e80: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
7e90: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
7ea0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7eb0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
7ec0: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
7ed0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
7ee0: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
7ef0: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
7f00: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7f10: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
7f20: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
7f30: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
7f40: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
7f50: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
7f60: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
7f70: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
7f80: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
7f90: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
7fa0: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
7fb0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
7fc0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7fd0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
7fe0: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
7ff0: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
8000: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
8010: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
8020: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
8030: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8040: 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64  OP_If, reg3); Vd
8050: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8060: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
8070: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8080: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
8090: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
80a0: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
80b0: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
80c0: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
80d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
80e0: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
80f0: 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20  ormat, reg3);.  
8100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8110: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
8120: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
8130: 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67  FILE_FORMAT, reg
8140: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
8150: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8160: 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29  Integer, ENC(db)
8170: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
8180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8190: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
81a0: 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f  iDb, BTREE_TEXT_
81b0: 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b  ENCODING, reg3);
81c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
81d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
81e0: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  1);..    /* This
81f0: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
8200: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
8210: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
8220: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
8230: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
8240: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
8250: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
8260: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
8270: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
8280: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
8290: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
82a0: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
82b0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
82c0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
82d0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
82e0: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
82f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
8300: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20  rse->regRowid.. 
8310: 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70     ** The root p
8320: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
8330: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c  e new table is l
8340: 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73  eft in reg pPars
8350: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
8360: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64  ** The rowid and
8370: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
8380: 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65  r values are nee
8390: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
83a0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69  that.    ** sqli
83b0: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
83c0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
83d0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
83e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
83f0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
8400: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8410: 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69  TABLE).    if( i
8420: 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75  sView || isVirtu
8430: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
8440: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8450: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8460: 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reg2);.    }else
8470: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
8480: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72      pParse->addr
8490: 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56  CrTab = sqlite3V
84a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
84b0: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62  CreateTable, iDb
84c0: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20  , reg2);.    }. 
84d0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
84e0: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
84f0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
8500: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8510: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c   OP_NewRowid, 0,
8520: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
8530: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
8540: 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67   OP_Blob, 6, reg
8550: 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50  3, 0, nullRow, P
8560: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  4_STATIC);.    s
8570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8580: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
8590: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
85a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
85b0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
85c0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
85d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
85e0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
85f0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
8600: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
8610: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
8620: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
8630: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
8640: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
8650: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
8660: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8670: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
8680: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
8690: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
86a0: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
86b0: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
86c0: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
86d0: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
86e0: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
86f0: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
8700: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
8710: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
8720: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
8730: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
8740: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
8750: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
8760: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
8770: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
8780: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
8790: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
87a0: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
87b0: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
87c0: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
87d0: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
87e0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
87f0: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
8800: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
8810: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
8820: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
8830: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
8840: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
8850: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
8860: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
8870: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
8880: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
8890: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
88a0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
88b0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
88c0: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
88d0: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
88e0: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
88f0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8900: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
8910: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
8920: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
8930: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
8940: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
8950: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
8960: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
8970: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8980: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
8990: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
89a0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
89b0: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
89c0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
89d0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
89e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
89f0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
8a00: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8a10: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
8a20: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
8a30: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
8a40: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
8a50: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
8a60: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
8a70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8a80: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8a90: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8aa0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8ab0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8ac0: 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  f.  z = sqlite3N
8ad0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
8ae0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
8af0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8b00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8b10: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
8b20: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
8b30: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
8b40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8b50: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8b60: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
8b70: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
8b80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8b90: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8ba0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8bb0: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
8bc0: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
8bd0: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
8be0: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
8bf0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
8c00: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
8c10: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
8c20: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
8c30: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
8c40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8c50: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
8c60: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8c70: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
8c80: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
8c90: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
8ca0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
8cb0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
8cc0: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
8cd0: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
8ce0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
8cf0: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
8d00: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
8d10: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
8d20: 69 74 79 0a 20 20 2a 2a 20 27 42 4c 4f 42 27 2e  ity.  ** 'BLOB'.
8d30: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
8d40: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
8d50: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
8d60: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
8d70: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
8d80: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
8d90: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
8da0: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
8db0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8dc0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
8dd0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b  pCol->szEst = 1;
8de0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
8df0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8e00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8e10: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8e20: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8e30: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8e40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8e50: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
8e60: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
8e70: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
8e80: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
8e90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
8ea0: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
8eb0: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
8ec0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
8ed0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8ee0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8ef0: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
8f00: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
8f10: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
8f20: 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   *p;.  p = pPars
8f30: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8f40: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
8f50: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
8f60: 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  eturn;.  p->aCol
8f70: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e  [p->nCol-1].notN
8f80: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
8f90: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
8fa0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
8fb0: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
8fc0: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
8fd0: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
8fe0: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
8ff0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
9000: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
9010: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
9020: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
9030: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
9040: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
9050: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
9060: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
9070: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
9080: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
9090: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
90a0: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
90b0: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
90c0: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
90d0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
90e0: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
90f0: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
9100: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
9110: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
9120: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
9130: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
9140: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
9150: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
9160: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
9170: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
9180: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
91b0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
91c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
91d0: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
91e0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
91f0: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
9200: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
9210: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
9220: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9230: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
9240: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9250: 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45 41  AFF_BLOB.** 'REA
9260: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
9270: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
9280: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
9290: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
92a0: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
92b0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
92c0: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
92d0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
92e0: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
92f0: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
9300: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
9310: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
9320: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
9330: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
9340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
9350: 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75  u8 *pszEst){.  u
9360: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
9370: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9380: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
9390: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
93a0: 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d   0;..  if( zIn==
93b0: 30 20 29 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  0 ) return aff;.
93c0: 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20    while( zIn[0] 
93d0: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
93e0: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
93f0: 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30  ToLower[(*zIn)&0
9400: 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  xff];.    zIn++;
9410: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
9420: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
9430: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
9440: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
9450: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
9460: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9470: 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61  TEXT;.      zCha
9480: 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c  r = zIn;.    }el
9490: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
94a0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
94b0: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
94c0: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
94d0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
94e0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
94f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9500: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
9510: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
9520: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
9530: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
9540: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9550: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9560: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
9570: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
9580: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
9590: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
95a0: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
95b0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
95c0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
95d0: 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20  F_REAL) ){.     
95e0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
95f0: 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66  F_BLOB;.      if
9600: 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20  ( zIn[0]=='(' ) 
9610: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66  zChar = zIn;.#if
9620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9630: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
9640: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9650: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
9660: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9670: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
9680: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
9690: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
96a0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
96b0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
96c0: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
96d0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
96e0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
96f0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
9700: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
9710: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9720: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9730: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9740: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9750: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
9760: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
9770: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
9780: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
9790: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
97a0: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
97b0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
97c0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
97d0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
97e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
97f0: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
9800: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
9810: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
9820: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
9830: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9840: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
9850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9860: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
9870: 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c  szEst is not NUL
9880: 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69  L, store an esti
9890: 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c  mate of the fiel
98a0: 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a  d size.  The.  *
98b0: 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63  * estimate is sc
98c0: 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  aled so that the
98d0: 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65   size of an inte
98e0: 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20  ger is 1.  */.  
98f0: 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20  if( pszEst ){.  
9900: 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20    *pszEst = 1;  
9910: 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65   /* default size
9920: 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74   is approx 4 byt
9930: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66  es */.    if( af
9940: 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  f<SQLITE_AFF_NUM
9950: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66  ERIC ){.      if
9960: 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20  ( zChar ){.     
9970: 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b     while( zChar[
9980: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0] ){.          
9990: 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67  if( sqlite3Isdig
99a0: 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a  it(zChar[0]) ){.
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
99c0: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
99d0: 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74     sqlite3GetInt
99e0: 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20  32(zChar, &v);. 
99f0: 20 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76             v = v
9a00: 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  /4 + 1;.        
9a10: 20 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20      if( v>255 ) 
9a20: 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20  v = 255;.       
9a30: 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76       *pszEst = v
9a40: 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41  ; /* BLOB(k), VA
9a50: 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b  RCHAR(k), CHAR(k
9a60: 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a  ) -> r=(k/4+1) *
9a70: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
9a80: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
9a90: 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72  .          zChar
9aa0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
9ab0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9ac0: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20     *pszEst = 5; 
9ad0: 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c    /* BLOB, TEXT,
9ae0: 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61   CLOB -> r=5  (a
9af0: 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a  pprox 20 bytes)*
9b00: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
9b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
9b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9b30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9b40: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
9b50: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
9b60: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
9b70: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
9b80: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
9b90: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
9ba0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
9bb0: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
9bc0: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
9bd0: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
9be0: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
9bf0: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
9c00: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9c10: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
9c20: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
9c30: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
9c40: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
9c50: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
9c60: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
9c70: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
9c80: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
9c90: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
9ca0: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
9cb0: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
9cc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9cd0: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
9ce0: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
9cf0: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
9d00: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
9d10: 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72  Col;..  p = pPar
9d20: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
9d30: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
9d40: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
9d50: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
9d60: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
9d70: 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  l-1];.  assert( 
9d80: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 7c  pCol->zType==0 |
9d90: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
9da0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9db0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 6f 6c  pParse->db, pCol
9dc0: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c  ->zType);.  pCol
9dd0: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
9de0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
9df0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 79 70 65  Parse->db, pType
9e00: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  );.  pCol->affin
9e10: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66  ity = sqlite3Aff
9e20: 69 6e 69 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e  inityType(pCol->
9e30: 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a  zType, &pCol->sz
9e40: 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Est);.}../*.** T
9e50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9e60: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
9e70: 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  ue for the most 
9e80: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63  recently added c
9e90: 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  olumn.** of the 
9ea0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
9eb0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9ec0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c  on..**.** Defaul
9ed0: 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69  t value expressi
9ee0: 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  ons must be cons
9ef0: 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20  tant.  Raise an 
9f00: 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69  exception if thi
9f10: 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20  s.** is not the 
9f20: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  case..**.** This
9f30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
9f40: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
9f50: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
9f60: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
9f70: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
9f80: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  E statement..*/.
9f90: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44  void sqlite3AddD
9fa0: 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73  efaultValue(Pars
9fb0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 53  e *pParse, ExprS
9fc0: 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54  pan *pSpan){.  T
9fd0: 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d  able *p;.  Colum
9fe0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
9ff0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
a000: 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  >db;.  p = pPars
a010: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a020: 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20  if( p!=0 ){.    
a030: 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  pCol = &(p->aCol
a040: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20  [p->nCol-1]);.  
a050: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
a060: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
a070: 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45  nction(pSpan->pE
a080: 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  xpr, db->init.bu
a090: 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sy) ){.      sql
a0a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a0b0: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
a0c0: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
a0d0: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
a0e0: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
a0f0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
a100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
a110: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
a120: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
a130: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
a140: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
a150: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
a160: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
a170: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
a180: 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66  y. The 'span' of
a190: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
a1a0: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
a1b0: 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74  ired by pragma t
a1c0: 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20  able_info..     
a1d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
a1e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a1f0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
a200: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
a210: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a220: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
a230: 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  r, EXPRDUP_REDUC
a240: 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  E);.      sqlite
a250: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
a260: 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->zDflt);.      
a270: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71  pCol->zDflt = sq
a280: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
a290: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
a2a0: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
a2d0: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
a2e0: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
a2f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a300: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
a310: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
a320: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63  r);.}../*.** Bac
a330: 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69  kwards Compatibi
a340: 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a  lity Hack:.** .*
a350: 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72  * Historical ver
a360: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
a370: 61 63 63 65 70 74 65 64 20 73 74 72 69 6e 67 73  accepted strings
a380: 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   as column names
a390: 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61   in.** indexes a
a3a0: 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  nd PRIMARY KEY c
a3b0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69  onstraints and i
a3c0: 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  n UNIQUE constra
a3d0: 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  ints.  Example:.
a3e0: 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45  **.**     CREATE
a3f0: 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63   TABLE xyz(a,b,c
a400: 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59  ,d,e,PRIMARY KEY
a410: 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27  ('a'),UNIQUE('b'
a420: 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69  ,'c' COLLATE tri
a430: 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45  m).**     CREATE
a440: 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79   INDEX abc ON xy
a450: 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27  z('c','d' DESC,'
a460: 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  e' COLLATE nocas
a470: 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  e DESC);.**.** T
a480: 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42  his is goofy.  B
a490: 75 74 20 74 6f 20 70 72 65 73 65 72 76 65 20 62  ut to preserve b
a4a0: 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
a4b0: 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e  bility we contin
a4c0: 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20  ue to.** accept 
a4d0: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
a4e0: 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73  e does the neces
a4f0: 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e  sary conversion.
a500: 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a    It converts.**
a510: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a520: 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67  given in its arg
a530: 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f  ument from a TK_
a540: 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b  STRING into a TK
a550: 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78  _ID.** if the ex
a560: 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74  pression is just
a570: 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74   a TK_STRING wit
a580: 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f  h an optional CO
a590: 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  LLATE clause..**
a5a0: 20 49 66 20 74 68 65 20 65 70 78 72 65 73 73 69   If the epxressi
a5b0: 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f  on is anything o
a5c0: 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52  ther than TK_STR
a5d0: 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65 73 73  ING, the express
a5e0: 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e  ion is.** unchan
a5f0: 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ged..*/.static v
a600: 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e  oid sqlite3Strin
a610: 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a  gToId(Expr *p){.
a620: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
a630: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d  STRING ){.    p-
a640: 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d  >op = TK_ID;.  }
a650: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  else if( p->op==
a660: 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d  TK_COLLATE && p-
a670: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53  >pLeft->op==TK_S
a680: 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e  TRING ){.    p->
a690: 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49  pLeft->op = TK_I
a6a0: 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
a6b0: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
a6c0: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
a6d0: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
a6e0: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
a6f0: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
a700: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
a710: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
a720: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
a730: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
a740: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
a750: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
a760: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
a770: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
a780: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
a790: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
a7a0: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
a7b0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
a7c0: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
a7d0: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
a7e0: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
a7f0: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
a800: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
a810: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
a820: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
a830: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
a840: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
a850: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
a860: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
a870: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
a880: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
a890: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
a8a0: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
a8b0: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
a8c0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
a8d0: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
a8e0: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
a8f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
a900: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
a910: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
a920: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
a930: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a940: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
a950: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
a960: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a970: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
a980: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
a990: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
a9a0: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
a9b0: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
a9c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
a9d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
a9e0: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
a9f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
aa00: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
aa10: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
aa20: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
aa30: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
aa40: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
aa50: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
aa60: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
aa70: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
aa80: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
aa90: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
aaa0: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
aab0: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
aac0: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
aad0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
aae0: 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a  sortOrder     /*
aaf0: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f   SQLITE_SO_ASC o
ab00: 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  r SQLITE_SO_DESC
ab10: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
ab20: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
ab30: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
ab40: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
ab50: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
ab60: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
ab70: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49  if( pTab==0 || I
ab80: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
ab90: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
aba0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
abb0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
abc0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
abd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
abe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
abf0: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
ac00: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
ac10: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
ac20: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
ac30: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
ac40: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
ac50: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
ac60: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
ac70: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
ac80: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
ac90: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
aca0: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
acb0: 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67  ol[iCol].colFlag
acc0: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49  s |= COLFLAG_PRI
acd0: 4d 4b 45 59 3b 0a 20 20 20 20 7a 54 79 70 65 20  MKEY;.    zType 
ace0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
acf0: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 6e 54  l].zType;.    nT
ad00: 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  erm = 1;.  }else
ad10: 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c  {.    nTerm = pL
ad20: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
ad30: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
ad40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
ad50: 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c  pr *pCExpr = sql
ad60: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
ad70: 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ate(pList->a[i].
ad80: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73  pExpr);.      as
ad90: 73 65 72 74 28 20 70 43 45 78 70 72 21 3d 30 20  sert( pCExpr!=0 
ada0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
adb0: 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70  StringToId(pCExp
adc0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  r);.      if( pC
add0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
ade0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
adf0: 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20   char *zCName = 
ae00: 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  pCExpr->u.zToken
ae10: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43  ;.        for(iC
ae20: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
ae30: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
ae40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
ae50: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e  lite3StrICmp(zCN
ae60: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
ae70: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
ae80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
ae90: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
aea0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
aeb0: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
aec0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
aed0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
aee0: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
aef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
af10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
af20: 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d    }.  if( nTerm=
af30: 3d 31 0a 20 20 20 26 26 20 7a 54 79 70 65 20 26  =1.   && zType &
af40: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
af50: 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52  (zType, "INTEGER
af60: 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74  ")==0.   && sort
af70: 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f  Order!=SQLITE_SO
af80: 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 70  _DESC.  ){.    p
af90: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
afa0: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
afb0: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
afc0: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
afd0: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
afe0: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
aff0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
b000: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
b010: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20  oincrement;.    
b020: 69 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72  if( pList ) pPar
b030: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
b040: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73   = pList->a[0].s
b050: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73  ortOrder;.  }els
b060: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
b070: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b080: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
b090: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
b0a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b0b0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
b0c0: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
b0d0: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
b0e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
b0f0: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
b100: 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  lse{.    Index *
b110: 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
b120: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
b130: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
b140: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
b150: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
b170: 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20  sortOrder, 0);. 
b180: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
b190: 20 20 70 2d 3e 69 64 78 54 79 70 65 20 3d 20 53    p->idxType = S
b1a0: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
b1b0: 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 7d 0a  IMARYKEY;.    }.
b1c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
b1d0: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
b1e0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
b1f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
b200: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
b210: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
b220: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
b230: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
b240: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b250: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
b260: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
b270: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
b280: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
b290: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b2a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b2b0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
b2c0: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
b2d0: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
b2e0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
b2f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b300: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
b310: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
b320: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
b330: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b340: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
b350: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
b360: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
b370: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
b380: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
b390: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
b3a0: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
b3b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b3c0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b3d0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
b3e0: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
b3f0: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
b400: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
b410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b420: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
b430: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b440: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
b450: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
b460: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
b470: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
b480: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
b490: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
b4a0: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
b4b0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
b4c0: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
b4d0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
b4e0: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
b4f0: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
b500: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
b510: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b520: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
b530: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
b540: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
b550: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
b560: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
b570: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
b580: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
b590: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
b5a0: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
b5b0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
b5c0: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
b5d0: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
b5e0: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
b5f0: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
b600: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
b610: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
b620: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
b630: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
b640: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
b650: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
b660: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b670: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
b680: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
b690: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b6a0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b6b0: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
b6c0: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
b6d0: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
b6e0: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
b6f0: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
b700: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
b710: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
b720: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
b730: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
b740: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
b750: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
b760: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
b770: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
b780: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
b790: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
b7a0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
b7b0: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
b7c0: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
b7d0: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
b7e0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
b7f0: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
b800: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
b810: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
b820: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
b830: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
b840: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
b850: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
b860: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
b870: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
b880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
b890: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b8a0: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
b8b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
b8c0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
b8d0: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
b8e0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
b8f0: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
b900: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
b910: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
b920: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
b930: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
b940: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
b950: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
b960: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
b970: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
b980: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
b990: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
b9a0: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
b9b0: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
b9c0: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
b9d0: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
b9e0: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
b9f0: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
ba00: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
ba10: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
ba20: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
ba30: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
ba40: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
ba50: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
ba60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
ba70: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
ba80: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
ba90: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
baa0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
bab0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
bac0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
bad0: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
bae0: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
baf0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bb00: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
bb10: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
bb20: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
bb30: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
bb40: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
bb50: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
bb60: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
bb70: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
bb80: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
bb90: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
bba0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
bbb0: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
bbc0: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
bbd0: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
bbe0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
bbf0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
bc00: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
bc10: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
bc20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bc30: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
bc40: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
bc50: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
bc60: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
bc70: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
bc80: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
bc90: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
bca0: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
bcb0: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
bcc0: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
bcd0: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
bce0: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
bcf0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
bd00: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
bd10: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
bd20: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
bd30: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
bd40: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
bd50: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
bd60: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
bd70: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
bd80: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
bd90: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
bda0: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
bdb0: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
bdc0: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
bdd0: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
bde0: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
bdf0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
be00: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
be10: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
be20: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
be30: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
be40: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
be50: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
be60: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
be70: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
be80: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
be90: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
bea0: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
beb0: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
bec0: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
bed0: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
bee0: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
bef0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
bf00: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
bf10: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
bf20: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
bf30: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
bf40: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
bf50: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
bf60: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
bf70: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
bf80: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
bf90: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
bfa0: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
bfb0: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
bfc0: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
bfd0: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
bfe0: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
bff0: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
c000: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69  e enough..*/.voi
c010: 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43  d sqlite3ChangeC
c020: 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61  ookie(Parse *pPa
c030: 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
c040: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
c050: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
c060: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se);.  sqlite3 *
c070: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c080: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c090: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
c0a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
c0b0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
c0c0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71   iDb, 0) );.  sq
c0d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c0e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64  v, OP_Integer, d
c0f0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
c100: 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
c110: 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c  ie+1, r1);.  sql
c120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c130: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
c140: 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d  iDb, BTREE_SCHEM
c150: 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a  A_VERSION, r1);.
c160: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
c170: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
c180: 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  r1);.}../*.** Me
c190: 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72  asure the number
c1a0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e   of characters n
c1b0: 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20  eeded to output 
c1c0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65  the given.** ide
c1d0: 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75  ntifier.  The nu
c1e0: 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  mber returned in
c1f0: 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65  cludes any quote
c200: 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f  s used.** but do
c210: 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
c220: 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  he null terminat
c230: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73  or..**.** The es
c240: 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72  timate is conser
c250: 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68  vative.  It migh
c260: 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74  t be larger that
c270: 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c   what is.** real
c280: 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ly needed..*/.st
c290: 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65  atic int identLe
c2a0: 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ngth(const char 
c2b0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *z){.  int n;.  
c2c0: 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b  for(n=0; *z; n++
c2d0: 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , z++){.    if( 
c2e0: 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20  *z=='"' ){ n++; 
c2f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
c300: 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 2;.}../*.** T
c310: 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
c320: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
c330: 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66  to an output buf
c340: 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  fer. The second 
c350: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
c360: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
c370: 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f   integer that co
c380: 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65  ntains the offse
c390: 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f  t at.** which to
c3a0: 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20   write into the 
c3b0: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54  output buffer. T
c3c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70  his function cop
c3d0: 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74  ies the.** nul-t
c3e0: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
c3f0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
c400: 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74  he third paramet
c410: 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  er, zSignedIdent
c420: 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63  ,.** to the spec
c430: 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20  ified offset in 
c440: 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75  the buffer and u
c450: 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20  pdates *pIdx to 
c460: 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  refer.** to the 
c470: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
c480: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77   the last byte w
c490: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65  ritten before re
c4a0: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20  turning..** .** 
c4b0: 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53  If the string zS
c4c0: 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69  ignedIdent consi
c4d0: 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
c4e0: 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a  alpha-numeric.**
c4f0: 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65   characters, doe
c500: 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  s not begin with
c510: 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20   a digit and is 
c520: 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f  not an SQL keywo
c530: 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  rd,.** then it i
c540: 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20  s copied to the 
c550: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78  output buffer ex
c560: 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20  actly as it is. 
c570: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74  Otherwise,.** it
c580: 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67   is quoted using
c590: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a   double-quotes..
c5a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
c5b0: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
c5c0: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
c5d0: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
c5e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c5f0: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
c600: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
c610: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
c620: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
c630: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20    i = *pIdx;..  
c640: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
c650: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  j]; j++){.    if
c660: 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  ( !sqlite3Isalnu
c670: 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20  m(zIdent[j]) && 
c680: 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29  zIdent[j]!='_' )
c690: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65   break;.  }.  ne
c6a0: 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65  edQuote = sqlite
c6b0: 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b  3Isdigit(zIdent[
c6c0: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
c6d0: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
c6e0: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
c6f0: 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20  !=TK_ID.        
c700: 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d      || zIdent[j]
c710: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
c720: 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20  || j==0;..  if( 
c730: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
c740: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
c750: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
c760: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
c770: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
c780: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
c790: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
c7a0: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
c7b0: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
c7c0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
c7d0: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
c7e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
c7f0: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
c800: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
c810: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
c820: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
c830: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
c840: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
c850: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
c860: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
c870: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
c880: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
c890: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
c8a0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
c8b0: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
c8c0: 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33  ableStmt(sqlite3
c8d0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
c8e0: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
c8f0: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
c900: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
c910: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f  ep2, *zEnd;.  Co
c920: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20  lumn *pCol;.  n 
c930: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20  = 0;.  for(pCol 
c940: 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  = p->aCol, i=0; 
c950: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
c960: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  pCol++){.    n +
c970: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43  = identLength(pC
c980: 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a  ol->zName) + 5;.
c990: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
c9a0: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
c9b0: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20  ;.  if( n<50 ){ 
c9c0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
c9d0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
c9e0: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
c9f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
ca00: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
ca10: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
ca20: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
ca30: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
ca40: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
ca50: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
ca60: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
ca70: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
ca80: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
ca90: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
caa0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cab0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
cac0: 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43  ntf(n, zStmt, "C
cad0: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
cae0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72    k = sqlite3Str
caf0: 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20  len30(zStmt);.  
cb00: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
cb10: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
cb20: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
cb30: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
cb40: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
cb50: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
cb60: 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ++){.    static 
cb70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
cb80: 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a  st azType[] = {.
cb90: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
cba0: 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f  E_AFF_BLOB    */
cbb0: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20   "",.        /* 
cbc0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
cbd0: 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20     */ " TEXT",. 
cbe0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
cbf0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20  _AFF_NUMERIC */ 
cc00: 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20  " NUM",.        
cc10: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  /* SQLITE_AFF_IN
cc20: 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c  TEGER */ " INT",
cc30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
cc40: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a  TE_AFF_REAL    *
cc50: 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b  / " REAL".    };
cc60: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
cc70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
cc80: 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
cc90: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
cca0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
ccb0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74  ;.    k += sqlit
ccc0: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d  e3Strlen30(&zStm
ccd0: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
cce0: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
ccf0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
cd00: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
cd10: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
cd20: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
cd30: 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29  _AFF_BLOB >= 0 )
cd40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
cd50: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
cd60: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41  ITE_AFF_BLOB < A
cd70: 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29  rraySize(azType)
cd80: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cd90: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cda0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
cdb0: 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  B );.    testcas
cdc0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cdd0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
cde0: 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  XT );.    testca
cdf0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
ce00: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
ce10: 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65  UMERIC );.    te
ce20: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
ce30: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
ce40: 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
ce50: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
ce60: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
ce70: 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20  TE_AFF_REAL );. 
ce80: 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20     .    zType = 
ce90: 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66  azType[pCol->aff
cea0: 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41  inity - SQLITE_A
ceb0: 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65  FF_BLOB];.    le
cec0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
ced0: 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
cee0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
cef0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
cf00: 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20  FF_BLOB .       
cf10: 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66       || pCol->af
cf20: 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41  finity==sqlite3A
cf30: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70  ffinityType(zTyp
cf40: 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d  e, 0) );.    mem
cf50: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
cf60: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
cf70: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
cf80: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
cf90: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
cfa0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
cfb0: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
cfc0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
cfd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a  ;.}../*.** Resiz
cfe0: 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  e an Index objec
cff0: 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75  t to hold N colu
d000: 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75  mns total.  Retu
d010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
d020: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53  on success and S
d030: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61  QLITE_NOMEM on a
d040: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a  n OOM error..*/.
d050: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a  static int resiz
d060: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c  eIndexObject(sql
d070: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
d080: 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20  *pIdx, int N){. 
d090: 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20   char *zExtra;. 
d0a0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
d0b0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
d0c0: 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =N ) return SQLI
d0d0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
d0e0: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
d0f0: 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d  ==0 );.  nByte =
d100: 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20   (sizeof(char*) 
d110: 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20  + sizeof(i16) + 
d120: 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d  1)*N;.  zExtra =
d130: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d140: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
d150: 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30  .  if( zExtra==0
d160: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d170: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
d180: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
d190: 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68  zColl, sizeof(ch
d1a0: 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  ar*)*pIdx->nColu
d1b0: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  mn);.  pIdx->azC
d1c0: 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 7a 45  oll = (char**)zE
d1d0: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
d1e0: 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  = sizeof(char*)*
d1f0: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
d200: 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ra, pIdx->aiColu
d210: 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a  mn, sizeof(i16)*
d220: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
d230: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
d240: 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b   = (i16*)zExtra;
d250: 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a  .  zExtra += siz
d260: 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65  eof(i16)*N;.  me
d270: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
d280: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70  x->aSortOrder, p
d290: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
d2a0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
d2b0: 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b  r = (u8*)zExtra;
d2c0: 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
d2d0: 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73   = N;.  pIdx->is
d2e0: 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72  Resized = 1;.  r
d2f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
d310: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77  te the total row
d320: 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62   width for a tab
d330: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
d340: 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  id estimateTable
d350: 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61  Width(Table *pTa
d360: 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  b){.  unsigned w
d370: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e  Table = 0;.  con
d380: 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43  st Column *pTabC
d390: 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  ol;.  int i;.  f
d3a0: 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c  or(i=pTab->nCol,
d3b0: 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61   pTabCol=pTab->a
d3c0: 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  Col; i>0; i--, p
d3d0: 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77  TabCol++){.    w
d3e0: 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c  Table += pTabCol
d3f0: 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69  ->szEst;.  }.  i
d400: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  f( pTab->iPKey<0
d410: 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70   ) wTable++;.  p
d420: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
d430: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54  sqlite3LogEst(wT
d440: 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  able*4);.}../*.*
d450: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61  * Estimate the a
d460: 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61  verage size of a
d470: 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65   row for an inde
d480: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
d490: 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  d estimateIndexW
d4a0: 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78  idth(Index *pIdx
d4b0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49  ){.  unsigned wI
d4c0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ndex = 0;.  int 
d4d0: 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  i;.  const Colum
d4e0: 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  n *aCol = pIdx->
d4f0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20  pTable->aCol;.  
d500: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
d510: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
d520: 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78      i16 x = pIdx
d530: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
d540: 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64     assert( x<pId
d550: 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  x->pTable->nCol 
d560: 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d  );.    wIndex +=
d570: 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b   x<0 ? 1 : aCol[
d580: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
d590: 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  ]].szEst;.  }.  
d5a0: 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d  pIdx->szIdxRow =
d5b0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
d5c0: 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20  Index*4);.}../* 
d5d0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76  Return true if v
d5e0: 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20  alue x is found 
d5f0: 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74  any of the first
d600: 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66   nCol entries of
d610: 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74   aiCol[].*/.stat
d620: 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e  ic int hasColumn
d630: 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f  (const i16 *aiCo
d640: 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74  l, int nCol, int
d650: 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43   x){.  while( nC
d660: 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78  ol-- > 0 ) if( x
d670: 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72  ==*(aiCol++) ) r
d680: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
d690: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
d6a0: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
d6b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70 61  at the end of pa
d6c0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
d6d0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74  ABLE statement t
d6e0: 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49 54  hat.** has a WIT
d6f0: 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73  HOUT ROWID claus
d700: 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  e.  The job of t
d710: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
d720: 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a  o convert both.*
d730: 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  * internal schem
d740: 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  a data structure
d750: 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72 61  s and the genera
d760: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73 6f  ted VDBE code so
d770: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61 72   that they.** ar
d780: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
d790: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
d7a0: 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  D table instead 
d7b0: 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65  of a rowid table
d7c0: 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 63  ..** Changes inc
d7d0: 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lude:.**.**     
d7e0: 28 31 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65  (1)  Convert the
d7f0: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
d800: 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74  into an OP_Creat
d810: 65 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69  eIndex.  There i
d820: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f  s.**          no
d830: 20 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72   rowid btree for
d840: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
d850: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
d860: 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20  canonical.**    
d870: 20 20 20 20 20 20 64 61 74 61 20 73 74 6f 72 61        data stora
d880: 67 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  ge is a covering
d890: 20 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a   index btree..**
d8a0: 20 20 20 20 20 28 32 29 20 20 42 79 70 61 73 73       (2)  Bypass
d8b0: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
d8c0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d8d0: 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a  er table entry.*
d8e0: 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74  *          for t
d8f0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  he PRIMARY KEY a
d900: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
d910: 79 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a  y index is now.*
d920: 2a 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74  *          ident
d930: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c  ified by the sql
d940: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
d950: 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
d960: 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20  ble itself..**  
d970: 20 20 20 28 33 29 20 20 53 65 74 20 74 68 65 20     (3)  Set the 
d980: 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68  Index.tnum of th
d990: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e  e PRIMARY KEY In
d9a0: 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  dex object in th
d9b0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63  e.**          sc
d9c0: 68 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74  hema to the root
d9d0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  page from the ma
d9e0: 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  in table..**    
d9f0: 20 28 34 29 20 20 53 65 74 20 61 6c 6c 20 63 6f   (4)  Set all co
da00: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
da10: 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20  MARY KEY schema 
da20: 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54  object to be NOT
da30: 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 35   NULL..**     (5
da40: 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  )  Add all table
da50: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
da60: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
da70: 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20  x object.**     
da80: 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65       so that the
da90: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
daa0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
dab0: 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a  .  The surplus.*
dac0: 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  *          colum
dad0: 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b  ns are part of K
dae0: 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 61  eyInfo.nXField a
daf0: 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  nd are not used 
db00: 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  for.**          
db10: 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75  sorting or looku
db20: 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20  p or uniqueness 
db30: 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28  checks..**     (
db40: 36 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20  6)  Replace the 
db50: 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c  rowid tail on al
db60: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
db70: 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45  generated UNIQUE
db80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64  .**          ind
db90: 69 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52  ices with the PR
dba0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
dbb0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
dbc0: 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f  d convertToWitho
dbd0: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72  utRowidTable(Par
dbe0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
dbf0: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
dc00: 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78  x *pIdx;.  Index
dc10: 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b   *pPk;.  int nPk
dc20: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
dc30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
dc40: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
dc50: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
dc60: 64 62 65 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  dbe;..  /* Conve
dc70: 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  rt the OP_Create
dc80: 54 61 62 6c 65 20 6f 70 63 6f 64 65 20 74 68 61  Table opcode tha
dc90: 74 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79  t would normally
dca0: 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 2a 2a   create the.  **
dcb0: 20 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20 74   root-page for t
dcc0: 68 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61 6e  he table into an
dcd0: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 20   OP_CreateIndex 
dce0: 6f 70 63 6f 64 65 2e 20 20 54 68 65 20 69 6e 64  opcode.  The ind
dcf0: 65 78 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  ex.  ** created 
dd00: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
dd10: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
dd20: 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  x..  */.  if( pP
dd30: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
dd40: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  ){.    assert( v
dd50: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
dd60: 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28  dbeChangeOpcode(
dd70: 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  v, pParse->addrC
dd80: 72 54 61 62 2c 20 4f 50 5f 43 72 65 61 74 65 49  rTab, OP_CreateI
dd90: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
dda0: 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d   Locate the PRIM
ddb0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20  ARY KEY index.  
ddc0: 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c  Or, if this tabl
ddd0: 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  e was originally
dde0: 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52  .  ** an INTEGER
ddf0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62   PRIMARY KEY tab
de00: 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  le, create a new
de10: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
de20: 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ex. .  */.  if( 
de30: 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
de40: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
de50: 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e  pList;.    Token
de60: 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 69   ipkToken;.    i
de70: 70 6b 54 6f 6b 65 6e 2e 7a 20 3d 20 70 54 61 62  pkToken.z = pTab
de80: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
de90: 65 79 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ey].zName;.    i
dea0: 70 6b 54 6f 6b 65 6e 2e 6e 20 3d 20 73 71 6c 69  pkToken.n = sqli
deb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 69 70 6b 54  te3Strlen30(ipkT
dec0: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 70 4c 69  oken.z);.    pLi
ded0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
dee0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
def0: 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  e, 0, .         
df00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
df10: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
df20: 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20  _ID, &ipkToken, 
df30: 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
df40: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
df50: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
df60: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72  sortOrder = pPar
df70: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
df80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
df90: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
dfa0: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 70 50 6b  =pTab );.    pPk
dfb0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
dfc0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
dfd0: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54   0, 0, pList, pT
dfe0: 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20  ab->keyConf, 0, 
dff0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
e000: 28 20 70 50 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( pPk==0 ) retur
e010: 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e 69 64 78 54  n;.    pPk->idxT
e020: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58  ype = SQLITE_IDX
e030: 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b  TYPE_PRIMARYKEY;
e040: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
e050: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
e060: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
e070: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
e080: 28 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  (pTab);..    /* 
e090: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
e0a0: 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41  ion of the PRIMA
e0b0: 52 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64  RY KEY btree and
e0c0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e0d0: 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  er.    ** table 
e0e0: 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f  entry. This is o
e0f0: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20  nly required if 
e100: 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61  currently genera
e110: 74 69 6e 67 20 56 44 42 45 0a 20 20 20 20 2a 2a  ting VDBE.    **
e120: 20 63 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41   code for a CREA
e130: 54 45 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68  TE TABLE (not wh
e140: 65 6e 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61  en parsing one a
e150: 73 20 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e  s part of readin
e160: 67 0a 20 20 20 20 2a 2a 20 61 20 64 61 74 61 62  g.    ** a datab
e170: 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f  ase schema).  */
e180: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
e190: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
e1a0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
e1b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e1c0: 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
e1d0: 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47   pPk->tnum, OP_G
e1e0: 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  oto);.    }..   
e1f0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76   /*.    ** Remov
e200: 65 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20  e all redundant 
e210: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
e220: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46   PRIMARY KEY.  F
e230: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e  or example, chan
e240: 67 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41  ge.    ** "PRIMA
e250: 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63  RY KEY(a,b,a,b,c
e260: 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75  ,b,c,d)" into ju
e270: 73 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28  st "PRIMARY KEY(
e280: 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65  a,b,c,d)".  Late
e290: 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73  r.    ** code as
e2a0: 73 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52  sumes the PRIMAR
e2b0: 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e  Y KEY contains n
e2c0: 6f 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d  o repeated colum
e2d0: 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ns..    */.    f
e2e0: 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d  or(i=j=1; i<pPk-
e2f0: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
e300: 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c        if( hasCol
e310: 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
e320: 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  n, j, pPk->aiCol
e330: 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  umn[i]) ){.     
e340: 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d     pPk->nColumn-
e350: 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
e360: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43          pPk->aiC
e370: 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b  olumn[j++] = pPk
e380: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
e390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e3a0: 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20   pPk->nKeyCol = 
e3b0: 6a 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69 73  j;.  }.  pPk->is
e3c0: 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20  Covering = 1;.  
e3d0: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
e3e0: 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e  ;.  nPk = pPk->n
e3f0: 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  KeyCol;..  /* Ma
e400: 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 63 6f  ke sure every co
e410: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50 52 49 4d  lumn of the PRIM
e420: 41 52 59 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e  ARY KEY is NOT N
e430: 55 4c 4c 2e 20 20 28 45 78 63 65 70 74 2c 0a 20  ULL.  (Except,. 
e440: 20 2a 2a 20 64 6f 20 6e 6f 74 20 65 6e 66 6f 72   ** do not enfor
e450: 63 65 20 74 68 69 73 20 66 6f 72 20 69 6d 70 6f  ce this for impo
e460: 73 74 65 72 20 74 61 62 6c 65 73 2e 29 20 2a 2f  ster tables.) */
e470: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
e480: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
e490: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
e4a0: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
e4b0: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b    pTab->aCol[pPk
e4c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e  ->aiColumn[i]].n
e4d0: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20  otNull = 1;.    
e4e0: 7d 0a 20 20 20 20 70 50 6b 2d 3e 75 6e 69 71 4e  }.    pPk->uniqN
e4f0: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a  otNull = 1;.  }.
e500: 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70  .  /* The root p
e510: 61 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41  age of the PRIMA
e520: 52 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61  RY KEY is the ta
e530: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f  ble root page */
e540: 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70  .  pPk->tnum = p
e550: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a  Tab->tnum;..  /*
e560: 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d   Update the in-m
e570: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
e580: 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51  tion of all UNIQ
e590: 55 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f  UE indices by co
e5a0: 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68  nverting.  ** th
e5b0: 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f  e final rowid co
e5c0: 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72  lumn into one or
e5d0: 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66   more columns of
e5e0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e5f0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
e600: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
e610: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
e620: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
e630: 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72   n;.    if( IsPr
e640: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
e650: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
e660: 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69      for(i=n=0; i
e670: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
e680: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
e690: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
e6a0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
e6b0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e6c0: 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) n++;.    }. 
e6d0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
e6e0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
e6f0: 65 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ex is a superset
e700: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
e710: 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64  key */.      pId
e720: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64  x->nColumn = pId
e730: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
e740: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
e750: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  }.    if( resize
e760: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
e770: 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  pIdx, pIdx->nKey
e780: 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b  Col+n) ) return;
e790: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e7a0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
e7b0: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
e7c0: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
e7d0: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
e7e0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
e7f0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e800: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  ) ){.        pId
e810: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  x->aiColumn[j] =
e820: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e830: 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ];.        pIdx-
e840: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b  >azColl[j] = pPk
e850: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
e860: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
e870: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
e880: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
e890: 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n>=pIdx->nKeyCol
e8a0: 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +n );.    assert
e8b0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
e8c0: 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =j );.  }..  /* 
e8d0: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
e8e0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
e8f0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
e900: 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54   */.  if( nPk<pT
e910: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
e920: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
e930: 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70  bject(db, pPk, p
e940: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74  Tab->nCol) ) ret
e950: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
e960: 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d  , j=nPk; i<pTab-
e970: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
e980: 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d     if( !hasColum
e990: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
e9a0: 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20   j, i) ){.      
e9b0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d    assert( j<pPk-
e9c0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
e9d0: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
e9e0: 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[j] = i;.      
e9f0: 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d    pPk->azColl[j]
ea00: 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   = "BINARY";.   
ea10: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
ea20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
ea30: 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  rt( pPk->nColumn
ea40: 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==j );.    asser
ea50: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a  t( pTab->nCol==j
ea60: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
ea70: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20   pPk->nColumn = 
ea80: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a  pTab->nCol;.  }.
ea90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
eaa0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
eab0: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
eac0: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
ead0: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
eae0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
eaf0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
eb00: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
eb10: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
eb20: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
eb30: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
eb40: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
eb50: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
eb60: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
eb70: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
eb80: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
eb90: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
eba0: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
ebb0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
ebc0: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
ebd0: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
ebe0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ebf0: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
ec00: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
ec10: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
ec20: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
ec30: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
ec40: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
ec50: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
ec60: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
ec70: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
ec80: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
ec90: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
eca0: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
ecb0: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
ecc0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
ecd0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
ece0: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
ecf0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ed00: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
ed10: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
ed20: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
ed30: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
ed40: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
ed50: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
ed60: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
ed70: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
ed80: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
ed90: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
eda0: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
edb0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
edc0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
edd0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
ede0: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
edf0: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
ee00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
ee10: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
ee20: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
ee30: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
ee40: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
ee50: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
ee60: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
ee70: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
ee80: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
ee90: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
eea0: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
eeb0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
eec0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
eed0: 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e  )' before option
eee0: 73 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  s in the CREATE 
eef0: 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61  TABLE */.  u8 ta
ef00: 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20 20  bOpts,          
ef10: 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c     /* Extra tabl
ef20: 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c  e options. Usual
ef30: 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  ly 0. */.  Selec
ef40: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
ef50: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
ef60: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
ef70: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
ef80: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20  .  Table *p;    
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efa0: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  The new table */
efb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
efc0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
efd0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
efe0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
eff0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
f000: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
f010: 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  se in which the 
f020: 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20  table lives */. 
f030: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
f040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
f050: 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f   implied index o
f060: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  f the table */..
f070: 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26    if( pEnd==0 &&
f080: 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20   pSelect==0 ){. 
f090: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
f0a0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
f0b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
f0c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
f0d0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
f0e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
f0f0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
f100: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
f110: 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
f120: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
f130: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
f140: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
f150: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
f160: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
f170: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
f180: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
f190: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
f1a0: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
f1b0: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
f1c0: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
f1d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
f1e0: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
f1f0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
f200: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
f210: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
f220: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
f230: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
f240: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
f250: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
f260: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
f270: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
f280: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
f290: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
f2a0: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  m;.  }..  /* Spe
f2b0: 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  cial processing 
f2c0: 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
f2d0: 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66  D Tables */.  if
f2e0: 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57  ( tabOpts & TF_W
f2f0: 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
f300: 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
f310: 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
f320: 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20  rement) ){.     
f330: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f340: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
f350: 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e     "AUTOINCREMEN
f360: 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  T not allowed on
f370: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
f380: 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72  ables");.      r
f390: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
f3a0: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
f3b0: 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
f3c0: 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yKey)==0 ){.    
f3d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f3e0: 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41  g(pParse, "PRIMA
f3f0: 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f  RY KEY missing o
f400: 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e  n table %s", p->
f410: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
f420: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46  e{.      p->tabF
f430: 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f  lags |= TF_Witho
f440: 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56  utRowid | TF_NoV
f450: 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20  isibleRowid;.   
f460: 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68     convertToWith
f470: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50  outRowidTable(pP
f480: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
f490: 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c    }..  iDb = sql
f4a0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f4b0: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
f4c0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
f4d0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
f4e0: 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
f4f0: 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f   in all CHECK co
f500: 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73  nstraint express
f510: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
f520: 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20   p->pCheck ){.  
f530: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
f540: 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
f550: 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68  arse, p, NC_IsCh
f560: 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63  eck, 0, p->pChec
f570: 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  k);.  }.#endif /
f580: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
f590: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
f5a0: 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20  ..  /* Estimate 
f5b0: 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20  the average row 
f5c0: 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62  size for the tab
f5d0: 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69  le and for all i
f5e0: 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a  mplied indices *
f5f0: 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c  /.  estimateTabl
f600: 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72  eWidth(p);.  for
f610: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
f620: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f630: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73  ->pNext){.    es
f640: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
f650: 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pIdx);.  }..  /
f660: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
f670: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
f680: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
f690: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
f6a0: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
f6b0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
f6c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
f6d0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
f6e0: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
f6f0: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
f700: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
f710: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
f720: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
f730: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
f740: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
f750: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
f760: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
f770: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
f780: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
f790: 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f  ;    /* "view" o
f7a0: 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20  r "table" */.   
f7b0: 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20   char *zType2;  
f7c0: 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54   /* "VIEW" or "T
f7d0: 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61  ABLE" */.    cha
f7e0: 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20  r *zStmt;    /* 
f7f0: 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  Text of the CREA
f800: 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41  TE TABLE or CREA
f810: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
f820: 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71  t */..    v = sq
f830: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f840: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  rse);.    if( NE
f850: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
f860: 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
f870: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f880: 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20  _Close, 0);..   
f890: 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74   /* .    ** Init
f8a0: 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72  ialize zType for
f8b0: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72   the new view or
f8c0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
f8d0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
f8e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
f8f0: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
f900: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
f910: 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
f920: 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
f930: 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
f940: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
f950: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
f960: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
f970: 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
f980: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
f990: 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
f9a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
f9b0: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
f9c0: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
f9d0: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
f9e0: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
f9f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
fa00: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
fa10: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
fa20: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
fa30: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
fa40: 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73  able is in regis
fa50: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
fa60: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oot..    **.    
fa70: 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
fa80: 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
fa90: 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
faa0: 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
fab0: 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
fac0: 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
fad0: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
fae0: 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
faf0: 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
fb00: 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
fb10: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
fb20: 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20   A shared-cache 
fb30: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
fb40: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72  t required to wr
fb50: 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74  ite to the new t
fb60: 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20  able,.    ** as 
fb70: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75  a schema-lock mu
fb80: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
fb90: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f  been obtained to
fba0: 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63   create it. Sinc
fbb0: 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d  e.    ** a schem
fbc0: 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20  a-lock excludes 
fbd0: 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61  all other databa
fbe0: 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72  se users, the wr
fbf0: 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20  ite-lock would. 
fc00: 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61     ** be redunda
fc10: 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nt..    */.    i
fc20: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
fc30: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
fc40: 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  est;    /* Where
fc50: 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75   the SELECT shou
fc60: 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73  ld store results
fc70: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
fc80: 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a  gYield;       /*
fc90: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
fca0: 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74  g co-routine ent
fcb0: 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ry-point */.    
fcc0: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
fcd0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
fce0: 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  the co-routine *
fcf0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
fd00: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ec;         /* A
fd10: 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e   record to be in
fd20: 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  sert into the ne
fd30: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  w table */.     
fd40: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20   int regRowid;  
fd50: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66       /* Rowid of
fd60: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f   the next row to
fd70: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20   insert */.     
fd80: 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70   int addrInsLoop
fd90: 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  ;    /* Top of t
fda0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65  he loop for inse
fdb0: 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rting rows */.  
fdc0: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
fdd0: 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62  ab;     /* A tab
fde0: 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  le that describe
fdf0: 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  s the SELECT res
fe00: 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ults */..      r
fe10: 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72  egYield = ++pPar
fe20: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
fe30: 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73  regRec = ++pPars
fe40: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
fe50: 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
fe60: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
fe70: 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e  assert(pParse->n
fe80: 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73  Tab==1);.      s
fe90: 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
fea0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
feb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fec0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
fed0: 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52   1, pParse->regR
fee0: 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  oot, iDb);.     
fef0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ff00: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
ff10: 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70  2ISREG);.      p
ff20: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
ff30: 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d  .      addrTop =
ff40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
ff50: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
ff60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
ff80: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
ff90: 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f  Yield, 0, addrTo
ffa0: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
ffb0: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
ffc0: 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
ffd0: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b  tine, regYield);
ffe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
fff0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
10000 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
10010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10020 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
10030 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
10040 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
10050 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10060 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a  , addrTop - 1);.
10070 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
10080 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
10090 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d  .      pSelTab =
100a0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
100b0 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
100c0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
100d0 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
100e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
100f0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
10100 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
10110 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
10120 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nCol;.      p->a
10130 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
10140 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
10150 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
10160 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
10170 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
10180 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
10190 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
101a0 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
101b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
101c0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
101d0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
101e0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
101f0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
10200 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10210 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10220 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
10230 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
10240 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
10250 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
10260 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
10270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10280 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
10290 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
102a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
102b0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
102c0 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
102d0 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
102e0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
102f0 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
10300 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10310 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10320 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
10330 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10340 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
10350 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
10360 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
10370 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
10380 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
10390 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
103a0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
103b0 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
103c0 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
103d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
103e0 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
103f0 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
10400 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
10410 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
10420 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
10430 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
10440 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
10450 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
10460 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
10470 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
10480 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10490 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
104a0 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
104b0 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
104c0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
104d0 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
104e0 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
104f0 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
10500 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10510 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
10520 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
10530 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
10540 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
10550 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
10560 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
10570 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
10580 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
10590 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
105a0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
105b0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
105c0 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
105d0 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
105e0 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
105f0 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
10600 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
10610 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
10620 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
10630 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
10640 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
10650 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
10660 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
10670 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
10680 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
10690 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
106a0 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
106b0 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
106c0 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
106d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
106e0 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
106f0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
10700 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
10710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10720 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
10730 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
10740 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
10750 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
10760 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
10770 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
10780 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
10790 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
107a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
107b0 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54   p->tabFlags & T
107c0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
107d0 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
107e0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
107f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10800 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
10810 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
10820 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
10830 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
10840 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
10850 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
10860 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
10870 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
10880 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
10890 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
108a0 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
108b0 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
108c0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
108d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
108e0 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
108f0 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
10900 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
10910 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
10920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10930 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
10940 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
10950 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
10960 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d  f(db, "tbl_name=
10970 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27  '%q' AND type!='
10980 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e  trigger'", p->zN
10990 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ame));.  }...  /
109a0 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
109b0 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
109c0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
109d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
109e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
109f0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10a00 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
10a10 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
10a20 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
10a30 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10a40 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
10a50 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
10a60 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
10a70 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
10a80 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
10a90 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a  , p->zName, p);.
10aa0 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
10ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
10ac0 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
10ad0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
10ae0 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
10af0 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
10b00 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
10b10 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ed = 1;.      re
10b20 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
10b30 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
10b40 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66  e = 0;.    db->f
10b50 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
10b60 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
10b70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10b80 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
10b90 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
10ba0 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
10bb0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
10bc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
10bd0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
10be0 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
10bf0 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
10c00 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
10c10 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
10c20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
10c30 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
10c40 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
10c50 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
10c60 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74  e = (int)((const
10c70 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a   char *)pCons->z
10c80 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20   - zName);.     
10c90 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
10ca0 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
10cb0 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
10cc0 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
10cd0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
10ce0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10cf0 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
10d00 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
10d10 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
10d20 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
10d30 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
10d40 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
10d50 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
10d60 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
10d70 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
10d80 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
10d90 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
10da0 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
10db0 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
10dc0 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
10dd0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
10de0 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
10df0 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
10e00 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
10e10 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
10e20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
10e30 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
10e40 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
10e50 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10e60 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f  CNames, /* Optio
10e70 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77  nal list of view
10e80 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
10e90 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
10ea0 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
10eb0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
10ec0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
10ed0 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
10ee0 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
10ef0 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
10f00 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
10f10 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
10f20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
10f30 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ss error message
10f40 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64  s if VIEW alread
10f50 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
10f60 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
10f70 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
10f80 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
10f90 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
10fa0 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
10fb0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62  e = 0;.  int iDb
10fc0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10fd0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
10fe0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
10ff0 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>0 ){.    sqlit
11000 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
11010 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61  e, "parameters a
11020 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
11030 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67  n views");.    g
11040 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
11050 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  fail;.  }.  sqli
11060 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
11070 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
11080 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
11090 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
110a0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
110b0 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
110c0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
110d0 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
110e0 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74  ew_fail;.  sqlit
110f0 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
11100 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
11110 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
11120 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
11130 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
11140 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  p->pSchema);.  s
11150 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
11160 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
11170 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
11180 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
11190 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
111a0 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20  pSelect) ) goto 
111b0 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
111c0 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  ;..  /* Make a c
111d0 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
111e0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
111f0 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
11200 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
11210 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
11220 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
11230 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
11240 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
11250 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
11260 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
11270 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
11280 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
11290 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
112a0 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
112b0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
112c0 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
112d0 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
112e0 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
112f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
11300 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50  db, pSelect, EXP
11310 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
11320 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  p->pCheck = sqli
11330 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
11340 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52  b, pCNames, EXPR
11350 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69  DUP_REDUCE);.  i
11360 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
11370 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74  led ) goto creat
11380 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20  e_view_fail;..  
11390 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
113a0 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
113b0 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
113c0 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
113d0 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
113e0 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
113f0 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
11400 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45  en;.  assert( sE
11410 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  nd.z[0]!=0 );.  
11420 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27  if( sEnd.z[0]!='
11430 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
11440 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
11450 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
11460 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a  n = (int)(sEnd.z
11470 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20   - pBegin->z);. 
11480 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
11490 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
114a0 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
114b0 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29  3Isspace(z[n-1])
114c0 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
114d0 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
114e0 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
114f0 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
11500 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
11510 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
11520 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
11530 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
11540 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
11550 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29   0, &sEnd, 0, 0)
11560 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66  ;..create_view_f
11570 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65  ail:.  sqlite3Se
11580 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
11590 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
115a0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
115b0 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20  (db, pCNames);. 
115c0 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
115d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
115e0 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64  _VIEW */..#if !d
115f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11600 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
11610 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11620 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f  _VIRTUALTABLE)./
11630 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
11640 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
11650 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
11660 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
11670 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
11680 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
11690 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
116a0 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
116b0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
116c0 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
116d0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
116e0 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
116f0 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
11700 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  se->zErrMsg..*/.
11710 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47  int sqlite3ViewG
11720 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
11730 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
11740 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54  le *pTable){.  T
11750 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20  able *pSelTab;  
11760 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65   /* A fake table
11770 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67   from which we g
11780 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  et the result se
11790 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
117a0 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79  Sel;     /* Copy
117b0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74   of the SELECT t
117c0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
117d0 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  he view */.  int
117e0 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f   nErr = 0;     /
117f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
11800 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  rs encountered *
11810 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
11820 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
11830 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rily holds the n
11840 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
11850 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73   assigned */.  s
11860 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11870 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
11880 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11890 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f   for malloc erro
118a0 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rs */.  sqlite3_
118b0 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20  xauth xAuth;    
118c0 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74     /* Saved xAut
118d0 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  h pointer */.  u
118e0 38 20 62 45 6e 61 62 6c 65 64 4c 41 3b 20 20 20  8 bEnabledLA;   
118f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76            /* Sav
11900 65 64 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ed db->lookaside
11910 2e 62 45 6e 61 62 6c 65 64 20 73 74 61 74 65 20  .bEnabled state 
11920 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  */..  assert( pT
11930 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
11940 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
11950 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
11960 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
11970 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
11980 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  Table) ){.    re
11990 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
119a0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  R;.  }.  if( IsV
119b0 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
119c0 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
119d0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
119e0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
119f0 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
11a00 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
11a10 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
11a20 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
11a30 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
11a40 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
11a50 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
11a60 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
11a70 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
11a80 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
11a90 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
11aa0 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
11ab0 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
11ac0 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
11ad0 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
11ae0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
11af0 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
11b00 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
11b10 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
11b20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
11b30 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
11b40 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
11b50 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
11b60 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
11b70 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
11b80 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
11b90 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
11ba0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
11bb0 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61  lly, the error a
11bc0 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67  bove is now caug
11bd0 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
11be0 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
11bf0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f  .  ** But the fo
11c00 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20  llowing test is 
11c10 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20  still important 
11c20 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20  as it does come 
11c30 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  up.  ** in the f
11c40 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a  ollowing:.  ** .
11c50 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
11c60 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61  TABLE main.ex1(a
11c70 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
11c80 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31  TE TEMP VIEW ex1
11c90 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
11ca0 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20  M ex1;.  **     
11cb0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
11cc0 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69  mp.ex1;.  */.  i
11cd0 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
11ce0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11cf0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11d00 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
11d10 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
11d20 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
11d30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
11d40 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
11d50 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
11d60 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
11d70 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
11d80 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
11d90 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
11da0 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
11db0 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
11dc0 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
11dd0 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
11de0 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
11df0 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
11e00 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
11e10 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
11e20 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
11e30 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
11e40 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
11e50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
11e60 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
11e70 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
11e80 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
11e90 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
11ea0 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
11eb0 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
11ec0 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
11ed0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
11ee0 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
11ef0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11f00 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
11f10 20 29 3b 0a 20 20 62 45 6e 61 62 6c 65 64 4c 41   );.  bEnabledLA
11f20 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
11f30 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 69 66 28  .bEnabled;.  if(
11f40 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20   pTable->pCheck 
11f50 29 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  ){.    db->looka
11f60 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
11f70 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  0;.    sqlite3Co
11f80 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
11f90 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
11fa0 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c            &pTabl
11fd0 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65  e->nCol, &pTable
11fe0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  ->aCol);.  }else
11ff0 7b 0a 20 20 20 20 70 53 65 6c 20 3d 20 73 71 6c  {.    pSel = sql
12000 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
12010 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
12020 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  t, 0);.    if( p
12030 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  Sel ){.      n =
12040 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
12050 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
12060 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
12070 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
12080 53 72 63 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Src);.      pTab
12090 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
120a0 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
120b0 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
120c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
120d0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
120e0 4f 4e 0a 20 20 20 20 20 20 78 41 75 74 68 20 3d  ON.      xAuth =
120f0 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
12100 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b    db->xAuth = 0;
12110 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d  .      pSelTab =
12120 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
12130 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
12140 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 64  , pSel);.      d
12150 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
12160 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 53  ;.#else.      pS
12170 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
12180 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
12190 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
121a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 50 61  #endif.      pPa
121b0 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
121c0 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
121d0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
121e0 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
121f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
12200 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
12210 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
12220 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
12230 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
12240 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  l;.        pSelT
12250 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
12260 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
12270 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
12280 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
12290 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
122a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
122b0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
122c0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
122d0 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
122e0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
122f0 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d  .        pTable-
12300 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
12310 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
12320 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
12330 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
12340 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 20 65 6c   pSel);.    } el
12350 73 65 20 7b 0a 20 20 20 20 20 20 6e 45 72 72 2b  se {.      nErr+
12360 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  +;.    }.  }.  d
12370 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
12380 61 62 6c 65 64 20 3d 20 62 45 6e 61 62 6c 65 64  abled = bEnabled
12390 4c 41 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  LA;.  pTable->pS
123a0 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61  chema->schemaFla
123b0 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
123c0 56 69 65 77 73 3b 0a 23 65 6e 64 69 66 20 2f 2a  Views;.#endif /*
123d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
123e0 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
123f0 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
12400 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
12410 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
12420 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12430 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
12440 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
12450 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
12460 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
12470 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
12480 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
12490 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
124a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
124b0 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
124c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
124d0 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
124e0 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
124f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12500 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
12510 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
12520 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
12530 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
12540 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
12550 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
12560 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
12570 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
12580 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
12590 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
125a0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
125b0 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
125c0 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
125d0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
125e0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
125f0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
12600 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
12610 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
12620 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
12630 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
12640 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
12650 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
12660 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
12670 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
12680 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
12690 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
126a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
126b0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
126c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
126d0 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
126e0 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
126f0 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
12700 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
12710 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
12720 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
12730 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
12740 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
12750 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
12760 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
12770 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
12780 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
12790 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
127a0 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
127b0 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
127c0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
127d0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
127e0 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
127f0 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
12800 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
12810 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
12820 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
12830 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
12840 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
12850 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
12860 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
12870 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
12880 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
12890 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
128a0 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
128b0 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
128c0 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
128d0 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
128e0 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
128f0 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
12900 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
12910 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
12920 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
12930 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
12940 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
12950 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
12960 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
12970 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
12980 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
12990 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
129a0 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
129b0 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
129c0 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
129d0 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
129e0 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
129f0 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
12a00 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
12a10 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
12a20 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
12a30 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12a40 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
12a50 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
12a60 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
12a70 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
12a80 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
12a90 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
12aa0 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
12ab0 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
12ac0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12ad0 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
12ae0 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
12af0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
12b00 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
12b10 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
12b20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
12b30 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
12b40 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
12b50 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
12b60 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
12b70 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
12b80 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
12b90 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
12ba0 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
12bb0 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
12bc0 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
12bd0 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
12be0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
12bf0 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
12c00 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
12c10 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
12c20 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
12c30 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
12c40 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
12c50 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
12c60 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
12c70 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
12c80 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
12c90 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
12ca0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
12cb0 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
12cc0 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
12cd0 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
12ce0 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
12cf0 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
12d00 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
12d10 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
12d20 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
12d30 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
12d40 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
12d50 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
12d60 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
12d70 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
12d80 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
12d90 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
12da0 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
12db0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12dc0 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
12dd0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
12de0 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
12df0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
12e00 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
12e10 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
12e20 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12e30 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
12e40 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12e50 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
12e60 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12e70 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
12e80 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
12e90 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
12ea0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
12eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12ec0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
12ed0 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
12ee0 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
12ef0 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
12f00 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
12f10 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
12f20 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
12f30 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
12f40 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
12f50 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
12f60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
12f70 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
12f80 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
12f90 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
12fa0 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
12fb0 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
12fc0 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
12fd0 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
12fe0 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
12ff0 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
13000 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
13010 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
13020 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
13030 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
13040 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
13050 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
13060 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
13070 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13080 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
13090 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
130a0 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
130b0 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
130c0 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
130d0 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
130e0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
130f0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
13100 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
13110 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
13120 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
13130 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
13140 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
13150 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
13160 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
13170 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
13180 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
13190 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
131a0 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
131b0 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
131c0 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
131d0 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
131e0 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
131f0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
13200 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
13210 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
13220 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
13230 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
13240 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
13250 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
13260 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
13270 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
13280 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
13290 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
132a0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
132b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
132c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
132d0 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
132e0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
132f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
13300 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
13310 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
13320 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
13330 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
13340 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
13350 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
13360 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
13370 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
13380 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
13390 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
133a0 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
133b0 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
133c0 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
133d0 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
133e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
133f0 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
13400 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
13410 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
13420 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
13430 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
13440 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
13450 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
13460 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
13470 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
13480 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
13490 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
134a0 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
134b0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
134c0 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
134d0 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
134e0 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
134f0 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
13500 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
13510 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
13520 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
13530 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
13540 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
13550 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
13560 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
13570 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
13580 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
13590 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
135a0 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
135b0 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
135c0 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
135d0 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
135e0 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
135f0 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
13600 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
13610 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
13620 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
13630 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
13640 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
13650 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
13660 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
13670 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
13680 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
13690 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
136a0 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
136b0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
136c0 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
136d0 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
136e0 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
136f0 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
13700 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
13710 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
13720 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
13730 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
13740 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
13750 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13760 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
13770 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
13780 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
13790 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
137a0 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
137b0 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
137c0 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
137d0 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
137e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
137f0 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
13800 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
13810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13820 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
13830 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
13840 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
13850 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
13860 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
13870 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64  && iDb<pParse->d
13880 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20  b->nDb );.      
13890 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
138a0 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
138b0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
138c0 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
138d0 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
138e0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
138f0 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
13900 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
13910 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20  atN tables (for 
13920 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a  N in (1,2,3)).**
13930 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e   after a DROP IN
13940 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c  DEX or DROP TABL
13950 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  E command..*/.st
13960 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
13970 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
13980 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13990 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
139a0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
139b0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
139d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75   The database nu
139e0 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  mber */.  const 
139f0 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20  char *zType,    
13a00 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62   /* "idx" or "tb
13a10 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  l" */.  const ch
13a20 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f  ar *zName      /
13a30 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20  * Name of index 
13a40 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  or table */.){. 
13a50 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
13a60 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
13a70 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
13a80 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f  iDb].zName;.  fo
13a90 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b  r(i=1; i<=4; i++
13aa0 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62  ){.    char zTab
13ab0 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [24];.    sqlite
13ac0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13ad0 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71  f(zTab),zTab,"sq
13ae0 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b  lite_stat%d",i);
13af0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13b00 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
13b10 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e  ->db, zTab, zDbN
13b20 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
13b30 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13b40 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
13b50 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
13b60 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
13b70 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  ,.        zDbNam
13b80 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20  e, zTab, zType, 
13b90 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
13ba0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13bb0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13bc0 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e  to drop a table.
13bd0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13be0 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61  CodeDropTable(Pa
13bf0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
13c00 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44  le *pTab, int iD
13c10 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  b, int isView){.
13c20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
13c30 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
13c40 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
13c50 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62   *pTrigger;.  Db
13c60 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
13c70 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71  [iDb];..  v = sq
13c80 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13c90 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
13ca0 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
13cb0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
13cc0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
13cd0 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
13ce0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13cf0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
13d00 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
13d10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13d20 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
13d30 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gin);.  }.#endif
13d40 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
13d50 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
13d60 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
13d70 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
13d80 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  . Code.  ** is g
13d90 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
13da0 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13db0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
13dc0 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65  d/or.  ** sqlite
13dd0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
13de0 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
13df0 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
13e00 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
13e10 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
13e20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
13e30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13e40 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
13e50 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
13e60 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  || .        pTri
13e70 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
13e80 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
13e90 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
13ea0 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
13eb0 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
13ec0 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
13ed0 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
13ee0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
13ef0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
13f00 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NCREMENT.  /* Re
13f10 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
13f20 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
13f30 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
13f40 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
13f50 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
13f60 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
13f70 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
13f80 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
13f90 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65  pped.  ** at the
13fa0 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
13fb0 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
13fc0 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
13fd0 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f  needs to.  ** mo
13fe0 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
13ff0 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
14000 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
14010 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a  acuum mode)..  *
14020 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  /.  if( pTab->ta
14030 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
14040 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
14050 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
14060 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
14070 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
14080 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
14090 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
140a0 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ,.      pDb->zNa
140b0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
140c0 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
140d0 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
140e0 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
140f0 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
14100 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
14110 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61  r to the.  ** ta
14120 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
14130 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
14140 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
14150 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
14160 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20  .  ** every row 
14170 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
14180 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
14190 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
141a0 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72  ne being.  ** dr
141b0 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20  opped. Triggers 
141c0 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
141d0 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61  rately because a
141e0 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a   trigger can be.
141f0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
14200 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
14210 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
14220 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
14230 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  her.  ** databas
14240 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
14250 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
14260 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c  rse, .      "DEL
14270 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
14280 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
14290 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
142a0 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62  ger'",.      pDb
142b0 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ->zName, SCHEMA_
142c0 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62  TABLE(iDb), pTab
142d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
142e0 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
142f0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14300 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
14310 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
14320 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
14330 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
14340 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
14350 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
14360 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  d modify.  ** th
14370 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
14380 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
14390 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
143a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
143b0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
143c0 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
143d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
143e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
143f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
14400 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
14410 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
14420 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
14430 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
14440 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
14450 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
14460 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, iDb);.}../*.*
14470 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14480 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
14490 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
144a0 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
144b0 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
144c0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
144d0 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
144e0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
144f0 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
14500 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
14510 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
14520 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
14530 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
14540 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
14550 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14560 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
14570 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  iDb;..  if( db->
14580 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14590 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
145a0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
145b0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
145c0 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nErr==0 );.  ass
145d0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
145e0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==1 );.  if( sql
145f0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
14600 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
14610 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14620 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
14630 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a  >suppressErr++;.
14640 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
14650 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
14660 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20  pParse, isView, 
14670 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20  &pName->a[0]);. 
14680 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
14690 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a  >suppressErr--;.
146a0 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
146b0 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20  {.    if( noErr 
146c0 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
146d0 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70  ifyNamedSchema(p
146e0 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
146f0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
14700 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14710 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
14720 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
14730 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
14740 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
14750 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
14760 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
14770 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69  ..  /* If pTab i
14780 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  s a virtual tabl
14790 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43  e, call ViewGetC
147a0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20  olumnNames() to 
147b0 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69  ensure.  ** it i
147c0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  s initialized.. 
147d0 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
147e0 75 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c  ual(pTab) && sql
147f0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
14800 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
14810 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Tab) ){.    goto
14820 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14830 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
14840 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
14850 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
14860 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f  int code;.    co
14870 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
14880 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
14890 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
148a0 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
148b0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
148c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
148d0 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rg2 = 0;.    if(
148e0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
148f0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
14900 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
14910 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
14920 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14930 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
14940 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
14950 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
14960 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
14970 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14980 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
14990 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
149a0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
149b0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
149c0 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  IEW;.      }.#if
149d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
149e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
149f0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
14a00 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14a10 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14a20 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a  TE_DROP_VTABLE;.
14a30 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71        zArg2 = sq
14a40 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
14a50 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e  b, pTab)->pMod->
14a60 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  zName;.#endif.  
14a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14a80 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
14a90 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
14aa0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14ab0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
14ac0 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
14ad0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14ae0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
14af0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
14b00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14b10 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
14b20 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
14b30 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29  ame, zArg2, zDb)
14b40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14b50 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14b60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
14b70 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14b80 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
14b90 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
14ba0 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
14bb0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14bc0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
14bd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
14be0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
14bf0 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
14c00 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
14c10 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
14c20 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
14c30 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  me, "sqlite_stat
14c40 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20  ", 11)!=0 ){.   
14c50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14c60 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
14c70 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
14c80 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
14c90 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
14ca0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14cb0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14cc0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
14cd0 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54  /* Ensure DROP T
14ce0 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64  ABLE is not used
14cf0 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20   on a view, and 
14d00 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74  DROP VIEW is not
14d10 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20   used.  ** on a 
14d20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
14d30 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
14d40 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
14d50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14d60 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
14d70 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
14d80 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
14d90 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14da0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14db0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
14dc0 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
14dd0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
14de0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14df0 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
14e00 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
14e10 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
14e20 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14e30 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14e40 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
14e50 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14e60 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
14e70 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
14e80 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
14e90 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
14ea0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
14eb0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14ec0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
14ed0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
14ee0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
14ef0 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
14f00 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
14f10 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
14f20 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e  b, "tbl", pTab->
14f30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
14f40 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70  te3FkDropTable(p
14f50 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54  Parse, pName, pT
14f60 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
14f70 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50  CodeDropTable(pP
14f80 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c  arse, pTab, iDb,
14f90 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65   isView);.  }..e
14fa0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
14fb0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
14fc0 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
14fd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
14fe0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
14ff0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
15000 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
15010 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
15020 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
15030 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
15040 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
15050 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
15060 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
15070 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
15080 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
15090 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
150a0 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
150b0 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
150c0 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
150d0 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
150e0 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
150f0 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
15100 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22   to (a.k.a the "
15110 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20  parent" table). 
15120 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
15130 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69  t.** of tables i
15140 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f  n the parent pTo
15150 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63   table.  flags c
15160 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
15170 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
15180 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
15190 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
151a0 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
151b0 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
151c0 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
151d0 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
151e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
151f0 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
15200 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
15210 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
15220 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
15230 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
15240 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
15250 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a  wTable field..**
15260 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
15270 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
15280 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
15290 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
152a0 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
152b0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
152c0 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
152d0 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
152e0 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
152f0 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
15300 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
15310 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
15320 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15330 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
15340 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
15350 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
15360 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
15370 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
15380 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
15390 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
153a0 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
153b0 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
153c0 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
153d0 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
153e0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
153f0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
15400 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
15410 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
15420 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
15430 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15440 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
15450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
15460 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
15470 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46   *pFKey = 0;.  F
15480 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20  Key *pNextTo;.  
15490 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
154a0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
154b0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
154c0 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
154d0 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
154e0 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
154f0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
15500 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
15510 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
15520 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
15530 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
15540 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
15550 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
15560 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
15570 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
15580 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
15590 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
155a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
155b0 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
155c0 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
155d0 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
155e0 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
155f0 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
15600 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
15610 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
15620 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
15630 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
15640 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
15650 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
15660 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
15670 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
15680 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
15690 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
156a0 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
156b0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
156c0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
156d0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
156e0 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
156f0 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
15700 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
15710 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
15720 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
15730 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
15740 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
15750 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
15760 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
15770 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
15780 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
15790 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
157a0 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
157b0 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
157c0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
157d0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
157e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
157f0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
15800 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
15810 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
15820 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
15830 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
15840 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
15850 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15860 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
15870 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
15880 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
15890 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
158a0 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
158b0 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
158c0 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
158d0 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
158e0 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
158f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
15900 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
15910 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
15920 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
15930 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
15940 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
15950 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
15960 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
15970 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
15980 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
15990 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
159a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
159b0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
159c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
159d0 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
159e0 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
159f0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
15a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15a10 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
15a20 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
15a30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15a40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15a50 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
15a60 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
15a70 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15a80 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
15a90 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
15aa0 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
15ab0 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
15ac0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
15ad0 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
15ae0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
15af0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
15b00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
15b10 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
15b20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
15b30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
15b40 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
15b50 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15b60 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
15b70 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
15b80 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
15b90 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
15ba0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
15bb0 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
15bc0 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
15bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
15be0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
15bf0 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
15c00 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
15c10 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
15c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
15c30 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
15c40 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
15c50 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
15c60 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
15c70 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
15c80 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
15c90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
15ca0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
15cb0 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
15cc0 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
15cd0 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
15ce0 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
15cf0 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
15d00 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
15d10 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b  zTo, (void *)pFK
15d20 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  ey.  );.  if( pN
15d30 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a  extTo==pFKey ){.
15d40 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
15d50 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f  iled = 1;.    go
15d60 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
15d70 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
15d80 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
15d90 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
15da0 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
15db0 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
15dc0 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
15dd0 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
15de0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
15df0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
15e00 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
15e10 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
15e20 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
15e30 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
15e40 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
15e50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15e60 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
15e70 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
15e80 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
15e90 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
15ea0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
15eb0 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
15ec0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
15ed0 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
15ee0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
15ef0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15f00 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
15f10 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
15f20 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
15f30 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
15f40 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
15f50 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
15f60 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
15f70 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
15f80 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
15f90 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
15fa0 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
15fb0 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
15fc0 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
15fd0 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
15fe0 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
15ff0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
16000 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
16010 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
16020 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
16030 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
16040 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
16050 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
16060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
16070 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
16080 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
16090 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
160a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
160b0 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
160c0 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
160d0 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
160e0 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
160f0 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
16100 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
16110 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
16120 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
16130 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
16140 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
16150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
16160 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
16170 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
16180 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
16190 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
161a0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
161b0 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
161c0 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
161d0 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
161e0 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
161f0 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
16200 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
16210 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
16220 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
16230 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
16240 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
16250 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
16260 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
16270 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
16280 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
16290 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
162a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
162b0 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
162c0 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
162d0 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
162e0 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
162f0 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
16300 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
16310 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
16320 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
16330 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
16340 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
16350 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
16360 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
16370 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
16380 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
16390 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
163a0 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
163b0 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
163c0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
163d0 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
163e0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
163f0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
16400 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
16410 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
16420 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
16430 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
16440 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
16450 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
16460 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
16470 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
16480 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20  .  int iSorter; 
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
164b0 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72  ed by OpenSorter
164c0 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a   (if in use) */.
164d0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
16500 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
16510 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20  int addr2;      
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16530 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  * Address to jum
16540 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74  p to for next it
16550 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
16560 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
16570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16580 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
16590 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74  x */.  int iPart
165a0 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  IdxLabel;       
165b0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
165c0 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
165d0 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56  kip a row */.  V
165e0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16600 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
16610 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
16620 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
16630 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16650 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
16660 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  x */.  int regRe
16670 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
16680 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
16690 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62  r holding assemb
166a0 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  led index record
166b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
166c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
166d0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
166e0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
166f0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
16700 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
16710 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
16720 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
16730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16740 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
16750 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16760 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
16770 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
16780 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
16790 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
167a0 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  .zName ) ){.    
167b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
167c0 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65  if..  /* Require
167d0 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
167e0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65   the table to pe
167f0 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61  rform this opera
16800 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
16810 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
16820 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
16830 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 1, pTab->zNa
16840 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  me);..  v = sqli
16850 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16860 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
16870 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d   return;.  if( m
16880 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b  emRootPage>=0 ){
16890 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52  .    tnum = memR
168a0 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  ootPage;.  }else
168b0 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e  {.    tnum = pIn
168c0 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20  dex->tnum;.  }. 
168d0 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
168e0 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
168f0 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 0a  arse, pIndex);..
16900 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f    /* Open the so
16910 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20 77  rter cursor if w
16920 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65  e are to use one
16930 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d  . */.  iSorter =
16940 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
16950 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16960 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
16970 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20  rOpen, iSorter, 
16980 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  0, pIndex->nKeyC
16990 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20  ol, (char*).    
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169b0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
169c0 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49  f(pKey), P4_KEYI
169d0 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  NFO);..  /* Open
169e0 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70   the table. Loop
169f0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77   through all row
16a00 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  s of the table, 
16a10 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a  inserting index.
16a20 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74    ** records int
16a30 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  o the sorter. */
16a40 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
16a50 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
16a60 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
16a70 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
16a80 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
16a90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
16aa0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56  ind, iTab, 0); V
16ab0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16ac0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
16ad0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16ae0 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69  pParse);..  sqli
16af0 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
16b00 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65  Key(pParse,pInde
16b10 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64  x,iTab,regRecord
16b20 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65  ,0,&iPartIdxLabe
16b30 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65  l,0,0);.  sqlite
16b40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16b50 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
16b60 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
16b70 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
16b80 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65  solvePartIdxLabe
16b90 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74 49  l(pParse, iPartI
16ba0 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  dxLabel);.  sqli
16bb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16bc0 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
16bd0 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f  addr1+1); VdbeCo
16be0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
16bf0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16c00 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66  (v, addr1);.  if
16c10 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20  ( memRootPage<0 
16c20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
16c30 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
16c40 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73   tnum, iDb);.  s
16c50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16c60 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
16c70 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44  , iIdx, tnum, iD
16c80 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  b, .            
16c90 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29          (char *)
16ca0 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
16cb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16cc0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
16cd0 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d  AG_BULKCSR|((mem
16ce0 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46  RootPage>=0)?OPF
16cf0 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b  LAG_P2ISREG:0));
16d00 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ..  addr1 = sqli
16d10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16d20 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
16d30 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62  iSorter, 0); Vdb
16d40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16d50 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20  assert( pKey!=0 
16d60 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
16d70 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
16d80 45 72 72 20 29 3b 0a 20 20 69 66 28 20 49 73 55  Err );.  if( IsU
16d90 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
16da0 78 29 20 26 26 20 70 4b 65 79 21 3d 30 20 29 7b  x) && pKey!=0 ){
16db0 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
16dc0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16dd0 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20  Addr(v) + 3;.   
16de0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
16df0 28 76 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64  (v, j2);.    add
16e00 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
16e10 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16e30 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
16e40 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
16e50 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
16e60 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16e80 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  Index->nKeyCol);
16e90 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
16ea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69  ;.    sqlite3Uni
16eb0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  queConstraint(pP
16ec0 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
16ed0 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65  pIndex);.  }else
16ee0 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  {.    addr2 = sq
16ef0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16f00 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73  Addr(v);.  }.  s
16f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16f20 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
16f30 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  a, iSorter, regR
16f40 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20  ecord, iIdx);.  
16f50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16f60 33 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49  3(v, OP_Last, iI
16f70 64 78 2c 20 30 2c 20 2d 31 29 3b 0a 20 20 73 71  dx, 0, -1);.  sq
16f80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16f90 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
16fa0 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64   iIdx, regRecord
16fb0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
16fc0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
16fd0 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
16fe0 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ULT);.  sqlite3R
16ff0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17000 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
17010 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17020 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
17030 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c  erNext, iSorter,
17040 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76   addr2); VdbeCov
17050 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
17060 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
17070 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71  v, addr1);..  sq
17080 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17090 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
170a0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
170b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
170c0 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ose, iIdx);.  sq
170d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
170e0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f  v, OP_Close, iSo
170f0 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rter);.}../*.** 
17100 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70  Allocate heap sp
17110 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49  ace to hold an I
17120 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68  ndex object with
17130 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a   nCol columns..*
17140 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
17150 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  e allocation siz
17160 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  e to provide an 
17170 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74  extra nExtra byt
17180 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20  es.** of 8-byte 
17190 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66  aligned space af
171a0 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
171b0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
171c0 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
171d0 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65  this extra space
171e0 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f   in *ppExtra..*/
171f0 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41  .Index *sqlite3A
17200 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
17210 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
17220 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b,         /* Da
17230 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
17240 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c  n */.  i16 nCol,
17250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17260 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
17270 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
17280 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  dex */.  int nEx
17290 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tra,          /*
172a0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
172b0 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20   of extra space 
172c0 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  to alloc */.  ch
172d0 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  ar **ppExtra    
172e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
172f0 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61   the "extra" spa
17300 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ce */.){.  Index
17310 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
17320 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64  /* Allocated ind
17330 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
17340 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
17350 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
17360 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20  space for Index 
17370 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20  object + arrays 
17380 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  */..  nByte = RO
17390 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
173a0 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  x)) +           
173b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
173c0 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
173d0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
173e0 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b  f(char*)*nCol) +
173f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17400 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
17410 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
17420 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a  (sizeof(LogEst)*
17430 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f  (nCol+1) +     /
17440 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67  * Index.aiRowLog
17450 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  Est   */.       
17460 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
17470 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (i16)*nCol +    
17480 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17490 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20  .aiColumn   */. 
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29  sizeof(u8)*nCol)
174c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
174d0 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
174e0 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  r */.  p = sqlit
174f0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
17500 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72  b, nByte + nExtr
17510 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
17520 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20     char *pExtra 
17530 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55  = ((char*)p)+ROU
17540 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
17550 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c  ));.    p->azCol
17560 6c 20 3d 20 28 63 68 61 72 2a 2a 29 70 45 78 74  l = (char**)pExt
17570 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61  ra;       pExtra
17580 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
17590 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a  f(char*)*nCol);.
175a0 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45      p->aiRowLogE
175b0 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45  st = (LogEst*)pE
175c0 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
175d0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
175e0 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e  nCol+1);.    p->
175f0 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
17600 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70  )pExtra;       p
17610 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
17620 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70  i16)*nCol;.    p
17630 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
17640 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20  u8*)pExtra;.    
17650 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  p->nColumn = nCo
17660 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f  l;.    p->nKeyCo
17670 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  l = nCol - 1;.  
17680 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63    *ppExtra = ((c
17690 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b  har*)p) + nByte;
176a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
176b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
176c0 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
176d0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
176e0 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
176f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17700 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
17710 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
17720 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
17730 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
17740 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
17750 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
17760 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
17770 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
17780 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
17790 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
177a0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
177b0 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
177c0 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
177d0 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
177e0 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
177f0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
17800 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
17810 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
17820 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
17830 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
17840 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
17850 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
17860 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
17870 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
17880 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
17890 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
178a0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
178b0 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
178c0 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
178d0 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
178e0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
178f0 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
17900 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
17910 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
17920 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  truction.  .**.*
17930 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  * If the index i
17940 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73  s created succes
17950 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61  sfully, return a
17960 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17970 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72  new Index.** str
17980 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20  ucture. This is 
17990 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41  used by sqlite3A
179a0 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74  ddPrimaryKey() t
179b0 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78  o mark the index
179c0 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
179d0 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49  s primary key (I
179e0 6e 64 65 78 2e 69 64 78 54 79 70 65 3d 3d 53 51  ndex.idxType==SQ
179f0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
17a00 4d 41 52 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65  MARYKEY).*/.Inde
17a10 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65  x *sqlite3Create
17a20 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
17a30 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
17a40 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
17a50 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
17a60 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
17a70 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
17a80 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
17a90 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
17aa0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
17ab0 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
17ac0 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
17ad0 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
17ae0 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
17af0 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
17b00 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
17b10 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
17b20 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
17b30 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
17b40 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
17b50 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
17b60 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
17b70 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
17b80 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
17b90 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
17ba0 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
17bb0 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
17bc0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
17bd0 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
17be0 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ns this statemen
17bf0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49  t */.  Expr *pPI
17c00 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45  Where,    /* WHE
17c10 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61  RE clause for pa
17c20 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f  rtial indices */
17c30 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
17c40 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
17c50 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
17c60 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
17c70 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
17c80 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f  otExist     /* O
17c90 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
17ca0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
17cb0 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  s */.){.  Index 
17cc0 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f  *pRet = 0;     /
17cd0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74  * Pointer to ret
17ce0 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  urn */.  Table *
17cf0 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pTab = 0;     /*
17d00 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
17d10 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
17d20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f  *pIndex = 0;   /
17d30 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
17d40 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
17d50 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
17d60 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17d70 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
17d80 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
17d90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17da0 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e  characters in zN
17db0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ame */.  int i, 
17dc0 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  j;.  DbFixer sFi
17dd0 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  x;        /* For
17de0 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62   assigning datab
17df0 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61  ase names to pTa
17e00 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ble */.  int sor
17e10 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a  tOrderMask;   /*
17e20 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43   1 to honor DESC
17e30 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f   in index.  0 to
17e40 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71   ignore. */.  sq
17e50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17e60 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44  se->db;.  Db *pD
17e70 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
17e80 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74  * The specific t
17e90 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
17ea0 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61  the indexed data
17eb0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
17ec0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
17ed0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
17ee0 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
17ef0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
17f00 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
17f10 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  = 0;    /* Unqua
17f20 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
17f30 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
17f40 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  te */.  struct E
17f50 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
17f60 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20  istItem; /* For 
17f70 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69  looping over pLi
17f80 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  st */.  int nExt
17f90 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
17fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
17fb0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
17fc0 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e  zExtra[] */.  in
17fd0 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20  t nExtraCol;    
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17ff0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
18000 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
18010 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74   */.  char *zExt
18020 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
18030 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
18040 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20  space after the 
18050 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
18060 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
18070 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52  ;      /* PRIMAR
18080 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
18090 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
180a0 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64  bles */..  if( d
180b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
180c0 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
180d0 41 42 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  AB || pParse->nE
180e0 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rr>0 ){.    goto
180f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18100 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51  ex;.  }.  if( SQ
18110 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
18120 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
18130 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
18140 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18150 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
18160 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
18170 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
18180 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
18190 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
181a0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
181b0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
181c0 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
181d0 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
181e0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
181f0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
18200 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
18210 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
18220 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
18230 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
18240 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
18250 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
18260 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18270 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
18280 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
18290 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
182a0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
182b0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
182c0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
182d0 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
182e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
182f0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26   assert( pName &
18300 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23  & pName->z );..#
18310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18320 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a  IT_TEMPDB.    /*
18330 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
18340 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
18350 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
18360 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
18370 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
18380 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
18390 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20  tabase to 1. Do 
183a0 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20  not do this.    
183b0 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69  ** if initialisi
183c0 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ng a database sc
183d0 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  hema..    */.   
183e0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
183f0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61  usy ){.      pTa
18400 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
18410 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
18420 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
18430 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d    if( pName2->n=
18440 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
18450 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
18460 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
18470 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d  ){.        iDb =
18480 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18490 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71  }.#endif..    sq
184a0 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
184b0 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
184c0 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
184d0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
184e0 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
184f0 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a  x, pTblName) ){.
18500 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
18510 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73   the parser cons
18520 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20  tructs pTblName 
18530 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64  from a single id
18540 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20  entifier,.      
18550 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
18560 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66  List can never f
18570 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ail. */.      as
18580 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
18590 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
185a0 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
185b0 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62  (pParse, 0, &pTb
185c0 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20  lName->a[0]);.  
185d0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
185e0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c  llocFailed==0 ||
185f0 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20   pTab==0 );.    
18600 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
18610 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18620 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44  ndex;.    if( iD
18630 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b  b==1 && db->aDb[
18640 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54  iDb].pSchema!=pT
18650 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
18660 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
18670 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
18680 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
18690 20 63 72 65 61 74 65 20 61 20 54 45 4d 50 20 69   create a TEMP i
186a0 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50  ndex on non-TEMP
186b0 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a   table \"%s\"",.
186c0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
186d0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  >zName);.      g
186e0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
186f0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18700 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
18710 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c  Tab) ) pPk = sql
18720 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
18730 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c  dex(pTab);.  }el
18740 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
18750 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pName==0 );.    
18760 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d  assert( pStart==
18770 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
18780 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
18790 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
187a0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
187b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
187c0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
187d0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
187e0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
187f0 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
18800 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65  Db[iDb];..  asse
18810 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
18820 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
18830 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66  >nErr==0 );.  if
18840 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
18850 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
18860 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
18870 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e 69  .       && db->i
18880 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20  nit.busy==0.#if 
18890 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
188a0 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20  ENTICATION.     
188b0 20 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 72    && sqlite3User
188c0 41 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d 3e  AuthTable(pTab->
188d0 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66  zName)==0.#endif
188e0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
188f0 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62  e3StrNICmp(&pTab
18900 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65  ->zName[7],"alte
18910 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a  rtab_",9)!=0 ){.
18920 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18930 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
18940 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
18950 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
18960 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
18970 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18980 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
18990 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
189a0 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
189b0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
189c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
189d0 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
189e0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
189f0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18a00 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18a10 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
18a20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
18a30 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
18a40 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
18a50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
18a60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18a70 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d  virtual tables m
18a80 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
18a90 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
18aa0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18ab0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
18ac0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
18ad0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
18ae0 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
18af0 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
18b00 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
18b10 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
18b20 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
18b30 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
18b40 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
18b50 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
18b60 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
18b70 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
18b80 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
18b90 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
18ba0 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
18bb0 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
18bc0 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
18bd0 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
18be0 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
18bf0 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
18c00 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
18c10 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
18c20 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
18c30 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
18c40 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
18c50 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
18c60 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
18c70 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
18c80 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
18c90 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
18ca0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
18cb0 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
18cc0 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
18cd0 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
18ce0 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
18cf0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
18d00 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
18d10 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
18d20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
18d30 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18d40 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
18d50 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30  ert( pName->z!=0
18d60 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
18d70 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
18d80 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
18d90 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
18da0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18db0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18dc0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
18dd0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
18de0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
18df0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
18e00 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
18e10 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
18e20 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
18e30 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
18e40 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
18e50 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
18e60 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18e70 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
18e80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18e90 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
18ea0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d  (db, zName, pDb-
18eb0 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
18ec0 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
18ed0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
18ee0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18ef0 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
18f00 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
18f10 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
18f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
18f30 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
18f40 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
18f50 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
18f60 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
18f70 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
18f80 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
18f90 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18fa0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
18fb0 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
18fc0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
18fd0 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
18fe0 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
18ff0 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
19000 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
19010 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
19020 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
19030 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
19040 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
19050 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
19060 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
19070 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19080 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
19090 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
190a0 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
190b0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
190c0 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
190d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
190e0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
190f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19100 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
19110 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19120 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
19130 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
19140 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
19150 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
19160 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19170 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19180 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
19190 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
191a0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
191b0 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
191c0 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
191d0 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
191e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
191f0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
19200 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
19210 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
19220 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19230 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19240 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
19250 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
19260 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
19270 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
19280 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
19290 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
192a0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
192b0 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
192c0 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
192d0 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
192e0 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
192f0 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
19300 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
19310 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
19320 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c     Token prevCol
19330 3b 0a 20 20 20 20 70 72 65 76 43 6f 6c 2e 7a 20  ;.    prevCol.z 
19340 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  = pTab->aCol[pTa
19350 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65  b->nCol-1].zName
19360 3b 0a 20 20 20 20 70 72 65 76 43 6f 6c 2e 6e 20  ;.    prevCol.n 
19370 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
19380 30 28 70 72 65 76 43 6f 6c 2e 7a 29 3b 0a 20 20  0(prevCol.z);.  
19390 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
193a0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
193b0 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
193c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
193d0 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
193e0 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30  _ID, &prevCol, 0
193f0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
19400 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
19410 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19420 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
19430 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
19440 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
19450 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c  tSetSortOrder(pL
19460 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b  ist, sortOrder);
19470 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
19480 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
19490 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c  ckLength(pParse,
194a0 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29   pList, "index")
194b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
194c0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
194d0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
194e0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
194f0 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
19500 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
19510 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19520 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
19530 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
19540 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
19550 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
19560 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
19570 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
19580 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
19590 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
195a0 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
195b0 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
195c0 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
195d0 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
195e0 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n));.    }.  }..
195f0 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
19600 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
19610 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
19620 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
19630 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
19640 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70  .  nExtraCol = p
19650 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk ? pPk->nKeyCo
19660 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20  l : 1;.  pIndex 
19670 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
19680 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
19690 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20   pList->nExpr + 
196a0 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20  nExtraCol,.     
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20   nName + nExtra 
196e0 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20  + 1, &zExtra);. 
196f0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
19700 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
19710 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19720 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
19730 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
19740 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
19750 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a  aiRowLogEst) );.
19760 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
19770 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
19780 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29  Index->azColl) )
19790 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
197a0 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45  e = zExtra;.  zE
197b0 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20  xtra += nName + 
197c0 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  1;.  memcpy(pInd
197d0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
197e0 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
197f0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
19800 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  Tab;.  pIndex->o
19810 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
19820 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
19830 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  uniqNotNull = on
19840 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a  Error!=OE_None;.
19850 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70    pIndex->idxTyp
19860 65 20 3d 20 70 4e 61 6d 65 20 3f 20 53 51 4c 49  e = pName ? SQLI
19870 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
19880 46 20 3a 20 53 51 4c 49 54 45 5f 49 44 58 54 59  F : SQLITE_IDXTY
19890 50 45 5f 55 4e 49 51 55 45 3b 0a 20 20 70 49 6e  PE_UNIQUE;.  pIn
198a0 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
198b0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
198c0 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e  ema;.  pIndex->n
198d0 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e  KeyCol = pList->
198e0 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49  nExpr;.  if( pPI
198f0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c  Where ){.    sql
19900 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
19910 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
19920 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64   pTab, NC_PartId
19930 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b  x, pPIWhere, 0);
19940 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61  .    pIndex->pPa
19950 72 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49  rtIdxWhere = pPI
19960 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68  Where;.    pPIWh
19970 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ere = 0;.  }.  a
19980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
19990 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
199a0 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20  , iDb, 0) );..  
199b0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
199c0 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
199d0 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
199e0 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
199f0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
19a00 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
19a10 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
19a20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
19a30 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
19a40 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
19a50 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
19a60 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
19a70 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
19a80 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74  ..  /* Analyze t
19a90 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
19aa0 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d  ssions that form
19ab0 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
19ac0 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a  e index and.  **
19ad0 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f   report any erro
19ae0 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d  rs.  In the comm
19af0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
19b00 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
19b10 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74  exactly.  ** a t
19b20 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f  able column, sto
19b30 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  re that column i
19b40 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46  n aiColumn[].  F
19b50 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65  or general expre
19b60 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70  ssions,.  ** pop
19b70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43  ulate pIndex->aC
19b80 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65  olExpr and store
19b90 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e   XN_EXPR (-2) in
19ba0 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a   aiColumn[]..  *
19bb0 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73  *.  ** TODO: Iss
19bc0 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20  ue a warning if 
19bd0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  two or more colu
19be0 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
19bf0 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a   are identical..
19c00 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65    ** TODO: Issue
19c10 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68   a warning if th
19c20 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20  e table primary 
19c30 6b 65 79 20 69 73 20 75 73 65 64 20 61 73 20 70  key is used as p
19c40 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  art of the.  ** 
19c50 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a  index key..  */.
19c60 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
19c70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
19c80 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
19c90 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
19ca0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45 78  {.    Expr *pCEx
19cb0 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
19cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
19cd0 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f   index expressio
19ce0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71  n */.    int req
19cf0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
19d00 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f          /* ASC o
19d10 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d  r DESC on the i-
19d20 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  th expression */
19d30 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
19d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19d50 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e      /* Collation
19d60 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
19d70 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  /..    sqlite3St
19d80 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74  ringToId(pListIt
19d90 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
19da0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
19db0 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
19dc0 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78  se, pTab, NC_Idx
19dd0 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d  Expr, pListItem-
19de0 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  >pExpr, 0);.    
19df0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
19e00 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19e10 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70  ate_index;.    p
19e20 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
19e30 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
19e40 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
19e50 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70 72  ;.    if( pCExpr
19e60 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
19e70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  ){.      if( pTa
19e80 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
19e90 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
19ea0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19eb0 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73 73  pParse, "express
19ec0 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20  ions prohibited 
19ed0 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  in PRIMARY KEY a
19ee0 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  nd ".           
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f00 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e       "UNIQUE con
19f10 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20  straints");.    
19f20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19f30 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19f40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
19f50 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d  ndex->aColExpr==
19f60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  0 ){.        Exp
19f70 72 4c 69 73 74 20 2a 70 43 6f 70 79 20 3d 20 73  rList *pCopy = s
19f80 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
19f90 70 28 64 62 2c 20 70 4c 69 73 74 2c 20 30 29 3b  p(db, pList, 0);
19fa0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
19fb0 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 70  >aColExpr = pCop
19fc0 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  y;.        if( !
19fd0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
19ff0 73 65 72 74 28 20 70 43 6f 70 79 21 3d 30 20 29  sert( pCopy!=0 )
1a000 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 69 73  ;.          pLis
1a010 74 49 74 65 6d 20 3d 20 26 70 43 6f 70 79 2d 3e  tItem = &pCopy->
1a020 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
1a030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
1a040 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
1a050 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1a060 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a  n[i] = XN_EXPR;.
1a070 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
1a080 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
1a090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a0a0 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c  j = pCExpr->iCol
1a0b0 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  umn;.      asser
1a0c0 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a  t( j<=0x7fff );.
1a0d0 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b        if( j<0 ){
1a0e0 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61  .        j = pTa
1a0f0 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
1a100 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
1a110 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
1a120 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
1a130 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1a140 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
1a150 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1a160 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29  olumn[i] = (i16)
1a170 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  j;.    }.    zCo
1a180 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ll = 0;.    if( 
1a190 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1a1a0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1a1b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
1a1c0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  oll;.      zColl
1a1d0 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45   = pListItem->pE
1a1e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
1a1f0 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
1a200 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
1a210 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
1a220 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
1a230 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
1a240 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
1a250 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
1a260 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
1a270 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
1a280 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
1a290 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
1a2a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e      }else if( j>
1a2b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  =0 ){.      zCol
1a2c0 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
1a2d0 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ].zColl;.    }. 
1a2e0 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
1a2f0 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22  zColl = "BINARY"
1a300 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  ;.    if( !db->i
1a310 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c  nit.busy && !sql
1a320 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
1a330 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
1a340 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1a350 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
1a370 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1a380 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65  zColl;.    reque
1a390 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20  stedSortOrder = 
1a3a0 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f  pListItem->sortO
1a3b0 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72  rder & sortOrder
1a3c0 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78  Mask;.    pIndex
1a3d0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1a3e0 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53  = (u8)requestedS
1a3f0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
1a400 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74   /* Append the t
1a410 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20  able key to the 
1a420 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
1a430 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52  .  For WITHOUT R
1a440 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73  OWID.  ** tables
1a450 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74   (when pPk!=0) t
1a460 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1a470 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59  declared PRIMARY
1a480 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20   KEY.  For.  ** 
1a490 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77  normal tables (w
1a4a0 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73  hen pPk==0) this
1a4b0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77   will be the row
1a4c0 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  id..  */.  if( p
1a4d0 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  Pk ){.    for(j=
1a4e0 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
1a4f0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
1a500 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  nt x = pPk->aiCo
1a510 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61  lumn[j];.      a
1a520 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20  ssert( x>=0 );. 
1a530 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
1a540 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  mn(pIndex->aiCol
1a550 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  umn, pIndex->nKe
1a560 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20  yCol, x) ){.    
1a570 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c      pIndex->nCol
1a580 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65  umn--; .      }e
1a590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
1a5a0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1a5b0 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49   = x;.        pI
1a5c0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
1a5d0 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  = pPk->azColl[j]
1a5e0 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1a5f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1a600 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65  = pPk->aSortOrde
1a610 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b  r[j];.        i+
1a620 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
1a630 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
1a640 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
1a650 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a660 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1a670 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a  [i] = XN_ROWID;.
1a680 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1a690 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[i] = "BINARY"
1a6a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1a6b0 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
1a6c0 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
1a6d0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
1a6e0 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
1a6f0 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
1a700 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
1a710 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
1a720 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
1a730 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
1a740 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
1a750 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1a760 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
1a770 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
1a780 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1a790 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
1a7a0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
1a7b0 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
1a7c0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1a7d0 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
1a7e0 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
1a7f0 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
1a800 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
1a810 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
1a820 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
1a830 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
1a840 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1a850 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
1a860 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
1a870 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
1a880 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
1a890 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
1a8a0 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
1a8b0 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
1a8c0 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
1a8d0 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
1a8e0 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
1a8f0 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
1a900 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1a910 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
1a920 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
1a930 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
1a940 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
1a950 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
1a960 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
1a970 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
1a980 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1a990 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
1a9a0 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
1a9b0 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
1a9c0 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
1a9d0 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
1a9e0 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
1a9f0 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
1aa00 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
1aa10 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
1aa20 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
1aa30 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
1aa40 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
1aa50 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
1aa60 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
1aa70 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
1aa80 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
1aa90 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
1aaa0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
1aab0 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
1aac0 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
1aad0 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
1aae0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1aaf0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
1ab00 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1ab10 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
1ab20 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
1ab30 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
1ab40 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1ab50 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20  (pIdx) );.      
1ab60 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64  assert( pIdx->id
1ab70 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
1ab80 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a  XTYPE_APPDEF );.
1ab90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1aba0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
1abb0 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  ex) );..      if
1abc0 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21  ( pIdx->nKeyCol!
1abd0 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  =pIndex->nKeyCol
1abe0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1abf0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
1ac00 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b  dx->nKeyCol; k++
1ac10 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1ac20 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20   char *z1;.     
1ac30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1ac40 32 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  2;.        asser
1ac50 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
1ac60 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[k]>=0 );.     
1ac70 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
1ac80 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
1ac90 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
1aca0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
1acb0 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
1acc0 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
1acd0 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1ace0 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
1acf0 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74   z1!=z2 && sqlit
1ad00 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
1ad10 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
1ad20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
1ad30 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
1ad40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1ad50 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
1ad60 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
1ad70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
1ad80 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
1ad90 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
1ada0 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
1adb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1adc0 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
1add0 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
1ade0 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
1adf0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
1ae00 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
1ae10 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
1ae20 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
1ae30 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
1ae40 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
1ae50 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
1ae60 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
1ae70 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
1ae80 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
1ae90 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
1aea0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1aeb0 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
1aec0 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
1aed0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
1aee0 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
1aef0 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
1af00 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
1af10 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
1af20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1af30 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
1af40 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
1af50 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1af60 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
1af70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1af80 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1af90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1afa0 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
1afb0 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1afc0 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
1afd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1afe0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
1aff0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
1b000 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
1b010 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
1b020 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
1b030 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
1b040 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b050 20 20 20 20 20 70 52 65 74 20 3d 20 70 49 64 78       pRet = pIdx
1b060 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1b070 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b090 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
1b0a0 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
1b0b0 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
1b0c0 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
1b0d0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
1b0e0 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
1b0f0 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
1b100 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1b110 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66  >nErr==0 );.  if
1b120 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1b130 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
1b140 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1b150 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1b160 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
1b170 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
1b180 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
1b190 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
1b1a0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
1b1b0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b1d0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49  Index->zName, pI
1b1e0 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
1b1f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b200 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
1b210 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
1b220 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
1b230 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
1b240 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
1b250 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b260 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1b270 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
1b280 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
1b290 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
1b2a0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
1b2b0 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
1b2c0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1b2d0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
1b2e0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1b2f0 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45  e initial CREATE
1b300 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1b310 20 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c   (or CREATE TABL
1b320 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  E if the.  ** in
1b330 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65  dex is an implie
1b340 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e  d index for a UN
1b350 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
1b360 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  KEY constraint) 
1b370 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63  then.  ** emit c
1b380 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ode to allocate 
1b390 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61  the index rootpa
1b3a0 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d  ge on disk and m
1b3b0 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
1b3c0 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
1b3d0 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
1b3e0 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70  ster table and p
1b3f0 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65  opulate the inde
1b400 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74  x with.  ** cont
1b410 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f  ent.  But, do no
1b420 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20  t do this if we 
1b430 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69  are simply readi
1b440 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
1b450 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
1b460 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68  to parse the sch
1b470 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20  ema, or if this 
1b480 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49  index is the PRI
1b490 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
1b4a0 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
1b4b0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20   ROWID table..  
1b4c0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
1b4d0 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
1b4e0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
1b4f0 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d  nerated as an im
1b500 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45  plied PRIMARY KE
1b510 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  Y.  ** or UNIQUE
1b520 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41   index in a CREA
1b530 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
1b540 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
1b550 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
1b560 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
1b570 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
1b580 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
1b590 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
1b5a0 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
1b5b0 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
1b5c0 0a 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52  .  else if( HasR
1b5d0 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54  owid(pTab) || pT
1b5e0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1b5f0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
1b600 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
1b610 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
1b620 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76  se->nMem;..    v
1b630 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1b640 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
1b650 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
1b660 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1b670 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ;..    sqlite3Be
1b680 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1b690 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1b6a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
1b6b0 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
1b6c0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  or the index usi
1b6d0 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20  ng CreateIndex. 
1b6e0 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  But before.    *
1b6f0 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65  * doing so, code
1b700 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74   a Noop instruct
1b710 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ion and store it
1b720 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20  s address in .  
1b730 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e    ** Index.tnum.
1b740 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1b750 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69  d in case this i
1b760 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79  ndex is actually
1b770 20 61 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41   a .    ** PRIMA
1b780 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74  RY KEY and the t
1b790 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79  able is actually
1b7a0 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1b7b0 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20   table. In .    
1b7c0 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74 68 65  ** that case the
1b7d0 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
1b7e0 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f  tRowidTable() ro
1b7f0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61  utine will repla
1b800 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f  ce.    ** the No
1b810 6f 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74  op with a Goto t
1b820 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  o jump over the 
1b830 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61  VDBE code genera
1b840 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20  ted below. */.  
1b850 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
1b860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b870 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(v, OP_Noop);.
1b880 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b890 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
1b8a0 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d  teIndex, iDb, iM
1b8b0 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74  em);..    /* Gat
1b8c0 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
1b8d0 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
1b8e0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1b8f0 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ent into.    ** 
1b900 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
1b910 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
1b920 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1b930 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28    int n = (int)(
1b940 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1b950 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29  en.z - pName->z)
1b960 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   + pParse->sLast
1b970 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69  Token.n;.      i
1b980 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d  f( pName->z[n-1]
1b990 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20  ==';' ) n--;.   
1b9a0 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
1b9b0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
1b9c0 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
1b9d0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
1b9e0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
1b9f0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1ba00 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
1ba10 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
1ba20 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
1ba30 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
1ba40 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  , n, pName->z);.
1ba50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ba60 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
1ba70 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
1ba80 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
1ba90 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
1baa0 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
1bab0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1bac0 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
1bad0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
1bae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1baf0 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
1bb00 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
1bb10 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
1bb20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
1bb30 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1bb40 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
1bb50 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
1bb60 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
1bb70 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
1bb80 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1bb90 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
1bba0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
1bbb0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1bbc0 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
1bbd0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1bbe0 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a   iMem,.        z
1bbf0 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
1bc00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1bc10 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  , zStmt);..    /
1bc20 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
1bc30 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
1bc40 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
1bc50 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
1bc60 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
1bc70 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
1bc80 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
1bc90 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
1bca0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
1bcb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1bcc0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1bcd0 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
1bce0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
1bcf0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1bd00 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1bd10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1bd20 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
1bd30 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  Db,.         sql
1bd40 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1bd50 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  "name='%q' AND t
1bd60 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49  ype='index'", pI
1bd70 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ndex->zName));. 
1bd80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bd90 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70  AddOp1(v, OP_Exp
1bda0 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ire, 0);.    }..
1bdb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1bdc0 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65  umpHere(v, pInde
1bdd0 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20  x->tnum);.  }.. 
1bde0 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
1bdf0 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
1be00 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
1be10 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
1be20 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
1be30 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
1be40 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
1be50 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
1be60 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
1be70 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
1be80 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
1be90 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
1bea0 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
1beb0 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
1bec0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
1bed0 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
1bee0 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
1bef0 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
1bf00 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
1bf10 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
1bf20 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
1bf30 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
1bf40 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
1bf50 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
1bf60 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
1bf70 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
1bf80 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1bf90 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
1bfa0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1bfb0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1bfc0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
1bfd0 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1bfe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1bff0 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
1c000 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1c010 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
1c020 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
1c030 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
1c040 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
1c050 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
1c060 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1c070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c080 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1c090 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1c0a0 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
1c0b0 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
1c0c0 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e  }.    pRet = pIn
1c0d0 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
1c0e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1c0f0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
1c100 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
1c110 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
1c120 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65  f( pIndex ) free
1c130 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1c140 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1c150 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1c160 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1c170 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1c180 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1c190 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1c1a0 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1c1b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c1c0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
1c1d0 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1c1e0 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1c1f0 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1c200 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1c210 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1c220 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1c230 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1c240 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1c250 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1c260 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1c270 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64  t[0] is supposed
1c280 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1c290 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1c2a0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
1c2b0 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
1c2c0 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
1c2d0 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
1c2e0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
1c2f0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
1c300 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1c310 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
1c320 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1c330 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
1c340 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
1c350 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1c360 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
1c370 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1c380 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1c390 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
1c3a0 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1c3b0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1c3c0 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1c3d0 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1c3e0 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1c3f0 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1c400 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1c410 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1c420 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1c430 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1c440 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1c450 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1c460 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1c470 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1c480 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1c490 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1c4a0 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1c4b0 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1c4c0 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1c4d0 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1c4e0 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1c4f0 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1c500 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1c510 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1c520 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1c530 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1c540 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20  x *pIdx){.  /*  
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
1c560 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36  ,  9,  8,  7,  6
1c570 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61   */.  LogEst aVa
1c580 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20  l[] = { 33, 32, 
1c590 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20  30, 28, 26 };.  
1c5a0 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78  LogEst *a = pIdx
1c5b0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  ->aiRowLogEst;. 
1c5c0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1c5d0 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29  (ArraySize(aVal)
1c5e0 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
1c5f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1c600 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65   Set the first e
1c610 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20  ntry (number of 
1c620 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
1c630 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  x) to the estima
1c640 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  ted .  ** number
1c650 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1c660 74 61 62 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66  table. Or 10, if
1c670 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
1c680 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20  umber of rows . 
1c690 20 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65   ** in the table
1c6a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1c6b0 61 74 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d  at.  */.  a[0] =
1c6c0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
1c6d0 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28  RowLogEst;.  if(
1c6e0 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1c6f0 3d 20 33 33 3b 20 20 20 20 20 20 20 20 61 73 73  = 33;        ass
1c700 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33  ert( 33==sqlite3
1c710 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20  LogEst(10) );.. 
1c720 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61   /* Estimate tha
1c730 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b  t a[1] is 10, a[
1c740 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73  2] is 9, a[3] is
1c750 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61   8, a[4] is 7, a
1c760 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e  [5] is.  ** 6 an
1c770 64 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  d each subsequen
1c780 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29  t value (if any)
1c790 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d   is 5.  */.  mem
1c7a0 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c  cpy(&a[1], aVal,
1c7b0 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f   nCopy*sizeof(Lo
1c7c0 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d  gEst));.  for(i=
1c7d0 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78  nCopy+1; i<=pIdx
1c7e0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
1c7f0 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20  .    a[i] = 23; 
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73     assert( 23==s
1c820 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20  qlite3LogEst(5) 
1c830 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1c840 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
1c850 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49  st(1) );.  if( I
1c860 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1c870 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65  x) ) a[pIdx->nKe
1c880 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  yCol] = 0;.}../*
1c890 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c8a0 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
1c8b0 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
1c8c0 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
1c8d0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
1c8e0 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
1c8f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
1c900 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
1c910 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1c920 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
1c930 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b  , int ifExists){
1c940 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1c950 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
1c960 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1c970 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1c980 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Db;..  assert( p
1c990 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1c9a0 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c  ;   /* Never cal
1c9b0 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
1c9c0 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
1c9d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c9e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1c9f0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1ca00 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
1ca10 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
1ca20 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1ca30 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1ca40 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
1ca50 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1ca60 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
1ca70 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1ca80 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
1ca90 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
1caa0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1cab0 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
1cac0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ==0 ){.    if( !
1cad0 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ifExists ){.    
1cae0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1caf0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1cb00 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
1cb10 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Name, 0);.    }e
1cb20 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1cb30 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
1cb40 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
1cb50 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1cb60 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  abase);.    }.  
1cb70 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1cb80 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
1cb90 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1cba0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
1cbb0 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d  Index->idxType!=
1cbc0 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1cbd0 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c  PPDEF ){.    sql
1cbe0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1cbf0 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
1cc00 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
1cc10 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
1cc20 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1cc30 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
1cc40 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
1cc50 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1cc60 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
1cc70 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1cc80 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
1cc90 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
1cca0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ccb0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1ccc0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
1ccd0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1cce0 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
1ccf0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
1cd00 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
1cd10 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
1cd20 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1cd30 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1cd40 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
1cd50 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
1cd60 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1cd70 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1cd80 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
1cd90 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
1cda0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1cdb0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1cdc0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1cdd0 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
1cde0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1cdf0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1ce00 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1ce10 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
1ce20 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
1ce30 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1ce40 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1ce50 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1ce60 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1ce70 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
1ce80 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
1ce90 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
1cea0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
1ceb0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
1cec0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1ced0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1cee0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1cef0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1cf00 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1cf10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
1cf20 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1cf30 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
1cf40 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
1cf50 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
1cf60 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
1cf70 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1cf80 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
1cf90 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65  ABLE(iDb), pInde
1cfa0 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
1cfb0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
1cfc0 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
1cfd0 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70  e, iDb, "idx", p
1cfe0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Index->zName);. 
1cff0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1d000 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1d010 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
1d020 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
1d030 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
1d040 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1d050 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1d060 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
1d070 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
1d080 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
1d090 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
1d0a0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1d0b0 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
1d0c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
1d0d0 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
1d0e0 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
1d0f0 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a  bjects. Each obj
1d100 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ect in the.** ar
1d110 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62  ray is szEntry b
1d120 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
1d130 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20  is routine uses 
1d140 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1d150 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20  ().** to extend 
1d160 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61  the array so tha
1d170 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65  t there is space
1d180 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63   for a new objec
1d190 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  t at the end..**
1d1a0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
1d1b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d1c0 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61  , *pnEntry conta
1d1d0 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ins the current 
1d1e0 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61  size of.** the a
1d1f0 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73  rray (in entries
1d200 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61   - so the alloca
1d210 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74  tion is ((*pnEnt
1d220 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62  ry) * szEntry) b
1d230 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c  ytes.** in total
1d240 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1d250 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63  realloc() is suc
1d260 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66  cessful (i.e. if
1d270 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   no OOM conditio
1d280 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a  n occurs), the.*
1d290 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * space allocate
1d2a0 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62  d for the new ob
1d2b0 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20  ject is zeroed, 
1d2c0 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64  *pnEntry updated
1d2d0 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74   to.** reflect t
1d2e0 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74  he new size of t
1d2f0 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70  he array and a p
1d300 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1d310 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  w allocation.** 
1d320 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20  returned. *pIdx 
1d330 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
1d340 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61  dex of the new a
1d350 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68  rray entry in th
1d360 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f  is case..**.** O
1d370 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1d380 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73   realloc() fails
1d390 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  , *pIdx is set t
1d3a0 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72  o -1, *pnEntry r
1d3b0 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e  emains.** unchan
1d3c0 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  ged and a copy o
1d3d0 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65  f pArray returne
1d3e0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
1d3f0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1d400 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1d410 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1d420 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1d430 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1d440 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72   */.  void *pArr
1d450 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ay,     /* Array
1d460 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69   of objects.  Mi
1d470 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ght be reallocat
1d480 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e  ed */.  int szEn
1d490 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a  try,      /* Siz
1d4a0 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74  e of each object
1d4b0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
1d4c0 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c  .  int *pnEntry,
1d4d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d4e0 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e  f objects curren
1d4f0 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  tly in use */.  
1d500 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
1d510 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
1d520 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
1d530 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
1d540 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
1d550 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69   = *pnEntry;.  i
1d560 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d  f( (n & (n-1))==
1d570 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  0 ){.    int sz 
1d580 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32  = (n==0) ? 1 : 2
1d590 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e  *n;.    void *pN
1d5a0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
1d5b0 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79  alloc(db, pArray
1d5c0 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20  , sz*szEntry);. 
1d5d0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1d5e0 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  {.      *pIdx = 
1d5f0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1d600 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20   pArray;.    }. 
1d610 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
1d620 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
1d630 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
1d640 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74  set(&z[n * szEnt
1d650 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
1d660 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20  ;.  *pIdx = n;. 
1d670 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72   ++*pnEntry;.  r
1d680 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a  eturn pArray;.}.
1d690 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1d6a0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
1d6b0 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
1d6c0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
1d6d0 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
1d6e0 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
1d6f0 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
1d700 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1d710 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1d720 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
1d730 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73  e3IdListAppend(s
1d740 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
1d750 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
1d760 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74   *pToken){.  int
1d770 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1d780 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1d790 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1d7a0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1d7b0 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  (IdList) );.    
1d7c0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1d7d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1d7e0 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
1d7f0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1d800 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
1d810 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20  pList->a,.      
1d820 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1d830 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  0]),.      &pLis
1d840 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69  t->nId,.      &i
1d850 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
1d860 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
1d870 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1d880 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1d890 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1d8a0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1d8b0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1d8c0 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
1d8d0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1d8e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1d8f0 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
1d900 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
1d910 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1d920 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1d930 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1d940 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1d950 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1d960 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1d970 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1d980 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1d990 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1d9a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1d9b0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1d9c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1d9d0 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
1d9e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1d9f0 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
1da00 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
1da10 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
1da20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
1da30 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
1da40 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
1da50 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
1da60 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1da70 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
1da80 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1da90 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
1daa0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1dab0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1dac0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1dad0 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
1dae0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1daf0 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1db00 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1db10 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
1db20 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1db30 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
1db40 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
1db50 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
1db60 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
1db70 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
1db80 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
1db90 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
1dba0 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
1dbb0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1dbc0 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
1dbd0 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
1dbe0 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
1dbf0 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
1dc00 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
1dc10 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
1dc20 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
1dc30 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
1dc40 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1dc50 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
1dc60 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
1dc70 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
1dc80 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
1dc90 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
1dca0 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
1dcb0 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
1dcc0 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
1dcd0 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
1dce0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
1dcf0 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
1dd00 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1dd10 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
1dd20 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
1dd30 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
1dd40 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
1dd50 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
1dd60 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
1dd70 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
1dd80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
1dd90 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
1dda0 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
1ddb0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
1ddc0 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
1ddd0 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
1dde0 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
1ddf0 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1de00 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1de10 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
1de20 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
1de30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1de40 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
1de50 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
1de60 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1de70 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
1de80 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
1de90 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1dea0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1deb0 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
1dec0 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
1ded0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
1dee0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1def0 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
1df00 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
1df10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1df20 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
1df30 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
1df40 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1df50 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
1df60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1df70 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
1df80 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1df90 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1dfa0 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
1dfb0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1dfc0 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
1dfd0 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
1dfe0 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
1dff0 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
1e000 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1e010 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
1e020 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1e030 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1e040 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
1e050 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1e060 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1e070 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
1e080 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
1e090 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
1e0a0 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
1e0b0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
1e0c0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1e0d0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1e0e0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1e0f0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
1e100 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
1e110 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
1e120 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
1e130 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
1e140 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
1e150 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
1e160 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
1e170 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a  >nAlloc = nGot;.
1e180 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
1e190 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
1e1a0 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
1e1b0 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
1e1c0 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
1e1d0 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
1e1e0 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1e1f0 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
1e200 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
1e210 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
1e220 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
1e230 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78  Src->nSrc += nEx
1e240 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
1e250 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1e260 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
1e270 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
1e280 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
1e290 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
1e2a0 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
1e2b0 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
1e2c0 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
1e2d0 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
1e2e0 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
1e2f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
1e300 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
1e310 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
1e320 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
1e330 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
1e340 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
1e350 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
1e360 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
1e370 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
1e380 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
1e390 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
1e3a0 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
1e3b0 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62  ist even if pTab
1e3c0 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  le is NULL..**.*
1e3d0 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
1e3e0 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1e3f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1e400 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20  OOM error.  The 
1e410 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
1e420 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
1e430 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
1e440 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
1e450 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
1e460 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
1e470 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
1e480 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
1e490 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
1e4a0 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
1e4b0 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
1e4c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e4d0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
1e4e0 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
1e4f0 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
1e500 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
1e510 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
1e520 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
1e530 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
1e540 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
1e550 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
1e560 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
1e570 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
1e580 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
1e590 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
1e5a0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
1e5b0 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
1e5c0 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
1e5d0 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
1e5e0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
1e5f0 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
1e600 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
1e610 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
1e620 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
1e630 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
1e640 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
1e650 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
1e660 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
1e670 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1e680 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
1e690 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
1e6a0 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
1e6b0 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
1e6c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1e6d0 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
1e6e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1e6f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1e700 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
1e710 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
1e720 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
1e730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1e740 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
1e750 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
1e760 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1e770 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1e780 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1e790 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
1e7a0 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
1e7b0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
1e7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1e7d0 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
1e7e0 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
1e7f0 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
1e800 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
1e810 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
1e820 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
1e830 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1e840 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
1e850 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
1e860 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
1e870 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
1e880 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
1e890 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
1e8a0 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
1e8b0 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
1e8c0 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
1e8d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1e8e0 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
1e8f0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
1e900 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1e910 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1e920 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
1e930 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
1e940 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
1e950 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
1e960 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
1e970 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
1e980 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
1e990 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
1e9a0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1e9b0 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
1e9c0 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
1e9d0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
1e9e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e9f0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1ea00 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c   pDatabase==0 ||
1ea10 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f   pTable!=0 );  /
1ea20 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20  * Cannot have C 
1ea30 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69  without B */.  i
1ea40 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1ea50 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1ea60 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1ea70 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  b, sizeof(SrcLis
1ea80 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1ea90 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1eaa0 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
1eab0 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lloc = 1;.  }.  
1eac0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53  pList = sqlite3S
1ead0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1eae0 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73  , pList, 1, pLis
1eaf0 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28 20  t->nSrc);.  if( 
1eb00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1eb10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1eb20 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1eb30 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1eb40 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74  urn 0;.  }.  pIt
1eb50 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
1eb60 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  List->nSrc-1];. 
1eb70 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
1eb80 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
1eb90 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
1eba0 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
1ebb0 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ( pDatabase ){. 
1ebc0 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
1ebd0 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
1ebe0 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
1ebf0 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
1ec00 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70  = pTemp;.  }.  p
1ec10 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
1ec20 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1ec30 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  en(db, pTable);.
1ec40 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
1ec50 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
1ec60 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
1ec70 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75  atabase);.  retu
1ec80 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
1ec90 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75  ** Assign VdbeCu
1eca0 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65  rsor index numbe
1ecb0 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
1ecc0 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
1ecd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1ece0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1ecf0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1ed00 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1ed10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1ed20 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ed30 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1ed40 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73  t(pList || pPars
1ed50 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1ed60 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
1ed70 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
1ed80 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
1ed90 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
1eda0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1edb0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1edc0 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
1edd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
1ede0 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
1edf0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1ee00 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
1ee10 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
1ee20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1ee30 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
1ee40 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
1ee50 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
1ee60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1ee70 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1ee80 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
1ee90 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
1eea0 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
1eeb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1eec0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  rcListDelete(sql
1eed0 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
1eee0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1eef0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
1ef00 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1ef10 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1ef20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1ef30 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1ef40 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
1ef50 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1ef60 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
1ef70 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1ef80 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
1ef90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1efa0 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
1efb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1efc0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1efd0 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
1efe0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
1eff0 78 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44  xedBy ) sqlite3D
1f000 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1f010 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
1f020 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
1f030 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73  fg.isTabFunc ) s
1f040 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
1f050 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1f060 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20  u1.pFuncArg);.  
1f070 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
1f080 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  able(db, pItem->
1f090 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
1f0a0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1f0b0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
1f0c0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1f0d0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
1f0e0 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
1f0f0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1f100 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
1f110 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
1f120 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f130 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1f140 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1f150 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1f160 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
1f170 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
1f180 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
1f190 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
1f1a0 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
1f1b0 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
1f1c0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
1f1d0 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
1f1e0 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
1f1f0 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
1f200 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
1f210 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1f220 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1f230 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
1f240 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
1f250 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
1f260 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
1f270 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
1f280 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1f290 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
1f2a0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
1f2b0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
1f2c0 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
1f2d0 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
1f2e0 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
1f2f0 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
1f300 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
1f310 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
1f320 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
1f330 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
1f340 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
1f350 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
1f360 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1f370 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
1f380 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
1f390 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
1f3a0 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
1f3b0 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
1f3c0 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
1f3d0 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
1f3e0 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
1f3f0 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
1f400 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
1f410 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
1f420 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
1f430 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
1f440 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
1f450 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
1f460 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
1f470 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1f480 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
1f490 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
1f4a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1f4b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1f4c0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1f4d0 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
1f4e0 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
1f4f0 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
1f500 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
1f510 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
1f520 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
1f530 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1f540 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
1f550 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1f560 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1f570 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
1f580 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1f590 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1f5a0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
1f5b0 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
1f5c0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1f5d0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
1f5e0 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
1f5f0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1f600 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
1f610 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
1f620 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
1f630 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1f640 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
1f650 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f660 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
1f670 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
1f680 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
1f690 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
1f6a0 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1f6b0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1f6c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1f6d0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1f6e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1f6f0 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
1f700 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
1f710 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1f720 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
1f730 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
1f740 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
1f750 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
1f760 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
1f770 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
1f780 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1f790 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
1f7a0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1f7b0 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
1f7c0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
1f7d0 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
1f7e0 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20  p->nSrc==0) ){. 
1f7f0 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1f800 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1f810 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
1f820 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73  ->nSrc-1];.  ass
1f830 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29  ert( pAlias!=0 )
1f840 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e  ;.  if( pAlias->
1f850 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
1f860 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
1f870 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1f880 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
1f890 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1f8a0 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
1f8b0 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
1f8c0 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
1f8d0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
1f8e0 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f  urn p;.. append_
1f8f0 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73  from_error:.  as
1f900 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
1f910 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1f920 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71  e(db, pOn);.  sq
1f930 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1f940 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
1f950 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1f960 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65  lete(db, pSubque
1f970 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ry);.  return 0;
1f980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1f990 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
1f9a0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1f9b0 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
1f9c0 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
1f9d0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
1f9e0 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
1f9f0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1fa00 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
1fa10 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1fa20 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
1fa30 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1fa40 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
1fa50 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65  dexedBy){.  asse
1fa60 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d  rt( pIndexedBy!=
1fa70 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0 );.  if( p && 
1fa80 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30  ALWAYS(p->nSrc>0
1fa90 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
1faa0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1fab0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1fac0 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
1fad0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f  rt( pItem->fg.no
1fae0 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  tIndexed==0 );. 
1faf0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1fb00 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
1fb10 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1fb20 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  t( pItem->fg.isT
1fb30 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
1fb40 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d   if( pIndexedBy-
1fb50 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78  >n==1 && !pIndex
1fb60 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  edBy->z ){.     
1fb70 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58   /* A "NOT INDEX
1fb80 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73  ED" clause was s
1fb90 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72  upplied. See par
1fba0 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63  se.y .      ** c
1fbb0 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65  onstruct "indexe
1fbc0 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69  d_opt" for detai
1fbd0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  ls. */.      pIt
1fbe0 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
1fbf0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
1fc00 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  {.      pItem->u
1fc10 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73  1.zIndexedBy = s
1fc20 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1fc30 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
1fc40 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  pIndexedBy);.   
1fc50 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49     pItem->fg.isI
1fc60 6e 64 65 78 65 64 42 79 20 3d 20 28 70 49 74 65  ndexedBy = (pIte
1fc70 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
1fc80 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  !=0);.    }.  }.
1fc90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
1fca0 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   list of functio
1fcb0 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  n arguments to t
1fcc0 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79  he SrcList entry
1fcd0 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d   for a.** table-
1fce0 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e  valued-function.
1fcf0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fd00 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28  SrcListFuncArgs(
1fd10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1fd20 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c  rcList *p, ExprL
1fd30 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1fd40 66 28 20 70 20 26 26 20 70 4c 69 73 74 20 29 7b  f( p && pList ){
1fd50 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1fd60 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1fd70 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1fd80 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1fd90 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
1fda0 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
1fdb0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1fdc0 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
1fdd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fde0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1fdf0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  nc==0 );.    pIt
1fe00 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
1fe10 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = pList;.    pIt
1fe20 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1fe30 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1fe40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1fe50 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
1fe60 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
1fe70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
1fe80 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
1fe90 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
1fea0 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
1feb0 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
1fec0 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
1fed0 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
1fee0 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
1fef0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
1ff00 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
1ff10 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
1ff20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
1ff30 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
1ff40 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
1ff50 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
1ff60 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
1ff70 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
1ff80 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
1ff90 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
1ffa0 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
1ffb0 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
1ffc0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1ffd0 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
1ffe0 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
1fff0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
20000 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
20010 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
20020 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
20030 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
20040 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
20050 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
20060 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
20070 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
20080 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
20090 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
200a0 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
200b0 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
200c0 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
200d0 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
200e0 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
200f0 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
20100 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
20110 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
20120 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
20130 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74  p->a[i].fg.joint
20140 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e  ype = p->a[i-1].
20150 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
20160 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66   }.    p->a[0].f
20170 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  g.jointype = 0;.
20180 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67    }.}../*.** Beg
20190 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
201a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
201b0 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
201c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
201d0 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
201e0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
201f0 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
20200 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
20210 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
20220 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
20230 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20  t( db!=0 );./*  
20240 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  if( db->aDb[0].p
20250 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  Bt==0 ) return; 
20260 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
20270 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
20280 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
20290 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
202a0 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
202b0 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
202c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
202d0 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
202e0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
202f0 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
20300 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
20310 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
20320 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
20330 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20340 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
20350 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
20360 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73  IVE)+1);.      s
20370 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
20380 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d  ree(v, i);.    }
20390 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
203a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
203b0 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  utoCommit, 0, 0)
203c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
203d0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
203e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
203f0 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
20400 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
20410 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
20420 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
20430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20440 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
20450 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20460 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20470 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20480 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
20490 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
204a0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
204b0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
204c0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
204d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
204e0 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
204f0 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  mmit, 1, 0);.  }
20500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
20510 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
20520 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20530 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
20540 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
20550 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  e){.  Vdbe *v;..
20560 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20570 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20580 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
20590 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
205a0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
205b0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
205c0 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  ION, "ROLLBACK",
205d0 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
205e0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
205f0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
20600 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
20610 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
20620 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
20630 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29  utoCommit, 1, 1)
20640 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
20650 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20660 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
20670 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72  rser when it par
20680 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f  ses a command to
20690 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65   create,.** rele
206a0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
206b0 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74  an SQL savepoint
206c0 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
206d0 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73  e3Savepoint(Pars
206e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
206f0 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  p, Token *pName)
20700 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
20710 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
20720 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
20730 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
20740 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64   zName ){.    Vd
20750 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
20760 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
20770 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20780 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
20790 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  N.    static con
207a0 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
207b0 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22  az[] = { "BEGIN"
207c0 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f  , "RELEASE", "RO
207d0 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61  LLBACK" };.    a
207e0 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e  ssert( !SAVEPOIN
207f0 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50  T_BEGIN && SAVEP
20800 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20  OINT_RELEASE==1 
20810 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  && SAVEPOINT_ROL
20820 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64  LBACK==2 );.#end
20830 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c  if.    if( !v ||
20840 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20850 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20860 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f  _SAVEPOINT, az[o
20870 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b  p], zName, 0) ){
20880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
20890 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
208a0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72   zName);.      r
208b0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
208c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
208d0 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69  p4(v, OP_Savepoi
208e0 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e  nt, op, 0, 0, zN
208f0 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ame, P4_DYNAMIC)
20900 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
20910 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
20920 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
20930 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
20940 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
20950 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
20960 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
20970 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
20980 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
20990 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
209a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e  .int sqlite3Open
209b0 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72  TempDatabase(Par
209c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
209d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
209e0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
209f0 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
20a00 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
20a10 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
20a20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  rc;.    Btree *p
20a30 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  Bt;.    static c
20a40 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
20a50 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
20a60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
20a70 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
20a80 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
20a90 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
20aa0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
20ab0 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  VE |.          S
20ac0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
20ad0 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
20ae0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
20af0 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72  _TEMP_DB;..    r
20b00 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20b10 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30  Open(db->pVfs, 0
20b20 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66  , db, &pBt, 0, f
20b30 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
20b40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
20b60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
20b70 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
20b80 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
20b90 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
20ba0 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
20bb0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
20bc0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
20bd0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
20be0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
20bf0 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70      db->aDb[1].p
20c00 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73  Bt = pBt;.    as
20c10 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d  sert( db->aDb[1]
20c20 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
20c30 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  if( SQLITE_NOMEM
20c40 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  ==sqlite3BtreeSe
20c50 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64  tPageSize(pBt, d
20c60 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c  b->nextPagesize,
20c70 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20   -1, 0) ){.     
20c80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
20c90 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  d = 1;.      ret
20ca0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
20cb0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20cc0 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
20cd0 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
20ce0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
20cf0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
20d00 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
20d10 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
20d20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
20d30 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
20d40 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
20d50 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
20d60 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
20d70 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
20d80 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
20d90 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
20da0 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
20db0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
20dc0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
20dd0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
20de0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
20df0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
20e00 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
20e10 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
20e20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20e30 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20  Toplevel->db;.. 
20e40 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
20e50 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
20e60 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
20e70 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
20e80 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61  || iDb==1 );.  a
20e90 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54  ssert( iDb<SQLIT
20ea0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32  E_MAX_ATTACHED+2
20eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
20ec0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
20ed0 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
20ee0 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b   );.  if( DbMask
20ef0 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Test(pToplevel->
20f00 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
20f10 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  ==0 ){.    DbMas
20f20 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
20f30 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
20f40 3b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d  ;.    pToplevel-
20f50 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
20f60 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
20f70 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
20f80 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28  _cookie;.    if(
20f90 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
20fa0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
20fb0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
20fc0 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76  Database(pToplev
20fd0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
20fe0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
20ff0 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
21000 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
21010 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
21020 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
21030 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
21040 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
21050 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
21060 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
21070 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
21080 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
21090 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
210a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
210b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
210c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
210d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
210e0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
210f0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
21100 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
21110 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
21120 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
21130 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
21140 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
21150 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b   pDb->zName)) ){
21160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
21170 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
21180 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
21190 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
211a0 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
211b0 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
211c0 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
211d0 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
211e0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
211f0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
21200 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
21210 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
21220 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
21230 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
21240 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
21250 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
21260 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
21270 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
21280 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
21290 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
212a0 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
212b0 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
212c0 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
212d0 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
212e0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
212f0 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
21300 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
21310 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
21320 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
21330 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
21340 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
21350 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
21360 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
21370 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
21380 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
21390 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
213a0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
213b0 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
213c0 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
213d0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
213e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
213f0 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
21400 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
21410 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
21420 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
21430 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
21440 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
21450 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
21460 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
21470 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
21480 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
21490 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
214a0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
214b0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
214c0 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
214d0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
214e0 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73  e, iDb);.  DbMas
214f0 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
21500 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b  writeMask, iDb);
21510 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
21520 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
21530 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
21540 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
21550 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
21560 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
21570 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
21580 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
21590 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
215a0 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
215b0 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
215c0 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
215d0 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
215e0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
215f0 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
21600 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
21610 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
21620 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
21630 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
21640 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
21650 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
21660 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
21670 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
21680 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
21690 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
216a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
216b0 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
216c0 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
216d0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
216e0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
216f0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
21700 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
21710 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
21720 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
21730 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
21740 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
21750 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
21760 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
21770 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
21780 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
21790 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
217a0 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
217b0 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
217c0 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
217d0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
217e0 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
217f0 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
21800 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
21810 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
21820 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
21830 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
21840 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
21850 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
21860 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
21870 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
21880 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
21890 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
218a0 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
218b0 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
218c0 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
218d0 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
218e0 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
218f0 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
21900 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
21910 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
21920 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
21930 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
21940 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
21950 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
21960 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
21970 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
21980 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
21990 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
219a0 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
219b0 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
219c0 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
219d0 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
219e0 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
219f0 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
21a00 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
21a10 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
21a20 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
21a30 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
21a40 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
21a50 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
21a60 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
21a70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
21a80 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
21a90 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
21aa0 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
21ab0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
21ac0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
21ad0 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
21ae0 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
21af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
21b00 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
21b10 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
21b20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
21b30 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
21b40 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
21b50 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
21b60 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
21b70 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
21b80 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
21b90 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
21ba0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
21bb0 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
21bc0 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
21bd0 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
21be0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
21bf0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
21c00 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20  .  int errCode, 
21c10 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64       /* extended
21c20 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
21c30 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
21c40 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74     /* Constraint
21c50 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
21c60 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *p4,         /* 
21c70 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
21c80 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20 20  .  i8 p4type,   
21c90 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49       /* P4_STATI
21ca0 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e  C or P4_TRANSIEN
21cb0 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d  T */.  u8 p5Errm
21cc0 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45  sg       /* P5_E
21cd0 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b  rrMsg type */.){
21ce0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
21cf0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
21d00 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  se);.  assert( (
21d10 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53  errCode&0xff)==S
21d20 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
21d30 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f   );.  if( onErro
21d40 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
21d50 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
21d60 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
21d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21d80 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
21d90 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72  errCode, onError
21da0 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29  , 0, p4, p4type)
21db0 3b 0a 20 20 69 66 28 20 70 35 45 72 72 6d 73 67  ;.  if( p5Errmsg
21dc0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
21dd0 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d  angeP5(v, p5Errm
21de0 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  sg);.}../*.** Co
21df0 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75  de an OP_Halt du
21e00 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50  e to UNIQUE or P
21e10 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
21e20 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e  raint violation.
21e30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21e40 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74  UniqueConstraint
21e50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21e60 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
21e70 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
21e80 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
21e90 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79  /* Constraint ty
21ea0 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  pe */.  Index *p
21eb0 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Idx       /* The
21ec0 20 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67   index that trig
21ed0 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61  gers the constra
21ee0 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  int */.){.  char
21ef0 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b   *zErr;.  int j;
21f00 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d  .  StrAccum errM
21f10 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  sg;.  Table *pTa
21f20 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
21f30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  ;..  sqlite3StrA
21f40 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67  ccumInit(&errMsg
21f50 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c  , pParse->db, 0,
21f60 20 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28 20   0, 200);.  if( 
21f70 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29  pIdx->aColExpr )
21f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50 72  {.    sqlite3XPr
21f90 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 30 2c  intf(&errMsg, 0,
21fa0 20 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70   "index '%q'", p
21fb0 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  Idx->zName);.  }
21fc0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  else{.    for(j=
21fd0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
21fe0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
21ff0 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
22000 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
22010 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29  aiColumn[j]>=0 )
22020 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70  ;.      zCol = p
22030 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e  Tab->aCol[pIdx->
22040 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
22050 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20  me;.      if( j 
22060 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
22070 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c  mAppend(&errMsg,
22080 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 20   ", ", 2);.     
22090 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
220a0 26 65 72 72 4d 73 67 2c 20 30 2c 20 22 25 73 2e  &errMsg, 0, "%s.
220b0 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
220c0 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , zCol);.    }. 
220d0 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69   }.  zErr = sqli
220e0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
220f0 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71  h(&errMsg);.  sq
22100 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
22110 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20  int(pParse, .   
22120 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
22130 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54  ex(pIdx) ? SQLIT
22140 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
22150 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20  MARYKEY .       
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22170 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f       : SQLITE_CO
22180 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c  NSTRAINT_UNIQUE,
22190 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45  .    onError, zE
221a0 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20  rr, P4_DYNAMIC, 
221b0 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
221c0 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  que);.}.../*.** 
221d0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
221e0 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75  due to non-uniqu
221f0 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64  e rowid..*/.void
22200 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e   sqlite3RowidCon
22210 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
22220 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
22230 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
22240 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
22250 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69  ,      /* Confli
22260 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
22270 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62  gorithm */.  Tab
22280 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f  le *pTab       /
22290 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68  * The table with
222a0 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20   the non-unique 
222b0 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63  rowid */ .){.  c
222c0 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74  har *zMsg;.  int
222d0 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d   rc;.  if( pTab-
222e0 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
222f0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22300 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
22310 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
22320 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54     pTab->aCol[pT
22350 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65  ab->iPKey].zName
22360 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
22370 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
22380 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73  IMARYKEY;.  }els
22390 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  e{.    zMsg = sq
223a0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
223b0 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77  rse->db, "%s.row
223c0 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  id", pTab->zName
223d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
223e0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
223f0 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  WID;.  }.  sqlit
22400 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
22410 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45  (pParse, rc, onE
22420 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  rror, zMsg, P4_D
22430 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20  YNAMIC,.        
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22450 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
22460 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  que);.}../*.** C
22470 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
22480 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63  Index uses the c
22490 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
224a0 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e  e pColl.  Return
224b0 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64  .** true if it d
224c0 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66  oes and false if
224d0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f   it does not..*/
224e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
224f0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
22500 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f  tic int collatio
22510 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
22520 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20  r *zColl, Index 
22530 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20  *pIndex){.  int 
22540 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f  i;.  assert( zCo
22550 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ll!=0 );.  for(i
22560 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
22570 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
22580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
22590 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
225a0 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
225b0 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  z!=0 || pIndex->
225c0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b  aiColumn[i]<0 );
225d0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
225e0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20  >aiColumn[i]>=0 
225f0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
22600 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29  ICmp(z, zColl) )
22610 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
22620 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
22630 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
22640 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
22650 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
22660 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
22670 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
22680 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
22690 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
226a0 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
226b0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
226c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
226d0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
226e0 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
226f0 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
22700 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
22710 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ab, char const *
22720 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20  zColl){.  Index 
22730 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
22740 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
22750 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
22760 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72  h pTab */..  for
22770 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49  (pIndex=pTab->pI
22780 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
22790 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65  ndex=pIndex->pNe
227a0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f  xt){.    if( zCo
227b0 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69  ll==0 || collati
227c0 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70  onMatch(zColl, p
227d0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
227e0 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
227f0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
22800 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
22810 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
22820 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
22830 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
22840 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
22850 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
22860 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
22870 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  ndex, -1);.    }
22880 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
22890 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
228a0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c  ll indices of al
228b0 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20  l tables in all 
228c0 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20  databases where 
228d0 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75  the.** indices u
228e0 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  se the collating
228f0 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
22900 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68    If pColl==0 th
22910 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20  en recompute.** 
22920 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72  all indices ever
22930 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ywhere..*/.#ifnd
22940 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
22950 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
22960 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61  id reindexDataba
22970 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ses(Parse *pPars
22980 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  e, char const *z
22990 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62  Coll){.  Db *pDb
229a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
229b0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
229c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
229d0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
229e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
229f0 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
22a00 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
22a10 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
22a20 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
22a30 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22a40 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65  ion */.  HashEle
22a50 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20  m *k;           
22a60 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22a70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22a80 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c  in pDb */.  Tabl
22a90 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
22aa0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
22ab0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
22ac0 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
22ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
22ae0 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
22af0 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66   );  /* Needed f
22b00 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73  or schema access
22b10 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c   */.  for(iDb=0,
22b20 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
22b30 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
22b40 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73  , pDb++){.    as
22b50 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a  sert( pDb!=0 );.
22b60 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
22b70 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
22b80 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
22b90 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
22ba0 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
22bb0 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
22bc0 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
22bd0 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
22be0 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
22bf0 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  pTab, zColl);.  
22c00 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
22c10 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
22c20 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
22c30 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
22c40 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
22c50 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
22c70 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
22c80 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
22c90 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
22ca0 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
22cb0 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
22cc0 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
22cd0 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
22ce0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
22cf0 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
22d00 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
22d10 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
22d20 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
22d30 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
22d40 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
22d50 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
22d60 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
22d70 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
22d80 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
22d90 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
22da0 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
22db0 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
22dc0 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
22dd0 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
22de0 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
22df0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
22e00 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
22e10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
22e20 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
22e30 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
22e40 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
22e50 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
22e60 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
22e70 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
22e80 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
22e90 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
22ea0 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
22eb0 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
22ec0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
22ed0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
22ee0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
22ef0 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
22f00 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
22f10 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
22f20 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
22f30 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
22f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
22f50 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
22f60 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
22f70 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
22f80 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
22f90 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
22fa0 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
22fb0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
22fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22fd0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
22fe0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
22ff0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
23000 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
23010 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
23020 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
23030 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
23040 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
23050 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
23060 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
23070 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
23080 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
23090 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
230a0 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
230b0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
230c0 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
230d0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
230e0 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
230f0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
23100 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
23110 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
23120 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
23130 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20   pName1==0 ){.  
23140 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
23150 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
23160 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
23170 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61  se if( NEVER(pNa
23180 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65  me2==0) || pName
23190 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63  2->z==0 ){.    c
231a0 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20  har *zColl;.    
231b0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e  assert( pName1->
231c0 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d  z );.    zColl =
231d0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
231e0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
231f0 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
23200 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
23210 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  rn;.    pColl = 
23220 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
23230 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20  eq(db, ENC(db), 
23240 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69  zColl, 0);.    i
23250 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
23260 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
23270 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  es(pParse, zColl
23280 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23290 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
232a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
232b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
232c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
232d0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ll);.  }.  iDb =
232e0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
232f0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
23300 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
23310 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
23320 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
23330 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
23340 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62  romToken(db, pOb
23350 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  jName);.  if( z=
23360 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
23370 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
23380 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20  ].zName;.  pTab 
23390 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
233a0 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  le(db, z, zDb);.
233b0 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
233c0 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
233d0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
233e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
233f0 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72  ee(db, z);.    r
23400 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
23410 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
23420 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
23430 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  b);.  sqlite3DbF
23440 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66  ree(db, z);.  if
23450 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
23460 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
23470 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
23480 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
23490 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
234a0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
234b0 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  x, -1);.    retu
234c0 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
234d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
234e0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65  , "unable to ide
234f0 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74  ntify the object
23500 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
23510 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ");.}.#endif../*
23520 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79  .** Return a Key
23530 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
23540 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61  hat is appropria
23550 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
23560 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68   Index..**.** Th
23570 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
23580 75 72 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ure for an index
23590 20 69 73 20 63 61 63 68 65 64 20 69 6e 20 74 68   is cached in th
235a0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a  e Index object..
235b0 2a 2a 20 53 6f 20 74 68 65 72 65 20 6d 69 67 68  ** So there migh
235c0 74 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 72 65  t be multiple re
235d0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
235e0 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
235f0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 65 72  .  The.** caller
23600 20 73 68 6f 75 6c 64 20 6e 6f 74 20 74 72 79 20   should not try 
23610 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 4b 65  to modify the Ke
23620 79 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a  yInfo object..**
23630 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
23640 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
23650 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
23660 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  () on the return
23670 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65  ed object.** whe
23680 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65  n it has finishe
23690 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b  d using it..*/.K
236a0 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
236b0 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61  eyInfoOfIndex(Pa
236c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
236d0 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74  ex *pIdx){.  int
236e0 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   i;.  int nCol =
236f0 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
23700 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64    int nKey = pId
23710 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65  x->nKeyCol;.  Ke
23720 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69  yInfo *pKey;.  i
23730 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
23740 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
23750 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  ( pIdx->uniqNotN
23760 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20  ull ){.    pKey 
23770 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
23780 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
23790 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65  , nKey, nCol-nKe
237a0 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
237b0 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
237c0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
237d0 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29  se->db, nCol, 0)
237e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79  ;.  }.  if( pKey
237f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23800 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
23810 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20  Writeable(pKey) 
23820 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
23830 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
23840 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20      char *zColl 
23850 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
23860 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
23870 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20   zColl!=0 );.   
23880 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69     pKey->aColl[i
23890 5d 20 3d 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c  ] = strcmp(zColl
238a0 2c 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 3f 20  ,"BINARY")==0 ? 
238b0 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 :.            
238c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
238d0 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
238e0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
238f0 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f  .      pKey->aSo
23900 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64  rtOrder[i] = pId
23910 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
23920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23930 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
23940 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
23950 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b  InfoUnref(pKey);
23960 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  .      pKey = 0;
23970 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23980 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66  urn pKey;.}..#if
23990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
239a0 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  _CTE./* .** This
239b0 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
239c0 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45  ked once per CTE
239d0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
239e0 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a  hile parsing a .
239f0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  ** WITH clause. 
23a00 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65  .*/.With *sqlite
23a10 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73  3WithAdd(.  Pars
23a20 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
23a30 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
23a40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68  ontext */.  With
23a50 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
23a60 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20      /* Existing 
23a70 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20  WITH clause, or 
23a80 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
23a90 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
23aa0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
23ab0 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f   common-table */
23ac0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72  .  ExprList *pAr
23ad0 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70  glist,     /* Op
23ae0 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61  tional column na
23af0 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  me list for the 
23b00 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
23b10 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20  t *pQuery       
23b20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64     /* Query used
23b30 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
23b40 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
23b50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
23b60 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74  Parse->db;.  Wit
23b70 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20  h *pNew;.  char 
23b80 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68  *zName;..  /* Ch
23b90 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45  eck that the CTE
23ba0 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20   name is unique 
23bb0 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48  within this WITH
23bc0 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a   clause. If.  **
23bd0 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65   not, store an e
23be0 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73  rror in the Pars
23bf0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
23c00 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
23c10 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
23c20 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
23c30 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  );.  if( zName &
23c40 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  & pWith ){.    i
23c50 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
23c60 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
23c70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
23c80 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
23c90 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61  (zName, pWith->a
23ca0 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
23cb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23cc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23cd0 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48   "duplicate WITH
23ce0 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22   table name: %s"
23cf0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
23d00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
23d10 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  f( pWith ){.    
23d20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
23d30 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69  of(*pWith) + (si
23d40 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d  zeof(pWith->a[1]
23d50 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29  ) * pWith->nCte)
23d60 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
23d70 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
23d80 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b  , pWith, nByte);
23d90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
23da0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
23db0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
23dc0 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20  eof(*pWith));.  
23dd0 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d  }.  assert( zNam
23de0 65 21 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20  e!=0 || pNew==0 
23df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
23e00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
23e10 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 0a   || pNew==0 );..
23e20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
23e30 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
23e40 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
23e50 41 72 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  Arglist);.    sq
23e60 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
23e70 65 28 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20  e(db, pQuery);. 
23e80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23e90 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
23ea0 20 70 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20   pNew = pWith;. 
23eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
23ec0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
23ed0 70 53 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79  pSelect = pQuery
23ee0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
23ef0 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20  ew->nCte].pCols 
23f00 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20  = pArglist;.    
23f10 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
23f20 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  te].zName = zNam
23f30 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e;.    pNew->a[p
23f40 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45  New->nCte].zCteE
23f50 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rr = 0;.    pNew
23f60 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nCte++;.  }.. 
23f70 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
23f80 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
23f90 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
23fa0 57 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73  With object pass
23fb0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
23fc0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
23fd0 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 44 65  id sqlite3WithDe
23fe0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
23ff0 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a  , With *pWith){.
24000 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
24010 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
24020 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e  r(i=0; i<pWith->
24030 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
24040 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
24050 74 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69  te = &pWith->a[i
24060 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
24070 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
24080 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b  b, pCte->pCols);
24090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
240a0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
240b0 43 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Cte->pSelect);. 
240c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
240d0 65 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  ee(db, pCte->zNa
240e0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
240f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
24100 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23   pWith);.  }.}.#
24110 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
24120 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  d(SQLITE_OMIT_CT
24130 45 29 20 2a 2f 0a                                E) */.