/ Hex Artifact Content
Login

Artifact 4f3f549d8cf1cc3c3573fd529910c6ba1fadfea4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
10b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10c0: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
10d0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10f0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1100: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1110: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1120: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1130: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1140: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1150: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1160: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1170: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1180: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1190: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
11a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11b0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11c0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11d0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11e0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11f0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1200: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1210: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1220: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79  oto>0 ){.      y
1230: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20  DbMask mask;.   
1240: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
1250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1260: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1270: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1280: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
1290: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
12a0: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
12b0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
12c0: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12d0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1310: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1330: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1340: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1350: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1360: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
1370: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13a0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13b0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
13c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20  VerifyCookie,.  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 69 44 62 2c 20 70            iDb, p
1410: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1420: 75 65 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20  ue[iDb],.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1450: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1460: 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ration);.       
1470: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64   }.      }.#ifnd
1480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1490: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14a0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
14b0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
14c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
14d0: 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  tabLock; i++){. 
14e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76           char *v
14f0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1500: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1510: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1520: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1550: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
1560: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1580: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1590: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  k = 0;.      }.#
15a0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
15b0: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
15c0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
15d0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
15e0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
15f0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1600: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1610: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1620: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1630: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1640: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1650: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1660: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1670: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1680: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1690: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
16a0: 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  y AUTOINCREMENT 
16b0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
16c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
16d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
16e0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67  AutoincrementBeg
16f0: 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  in(pParse);..   
1700: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1710: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1720: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1730: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1740: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1760: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
1770: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b  se->cookieGoto);
1780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1790: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
17a0: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
17b0: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
17c0: 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41 59    if( v && ALWAY
17d0: 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  S(pParse->nErr==
17e0: 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  0) && !db->mallo
17f0: 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65  cFailed ){.#ifde
1800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1810: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
1820: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1830: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
1840: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
1850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1860: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
1870: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
1880: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1890: 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f  heLevel==0 );  /
18a0: 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72  * Disables and r
18b0: 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20  e-enables match 
18c0: 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69  */.    /* A mini
18d0: 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f  mum of one curso
18e0: 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66  r is required if
18f0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69   autoincrement i
1900: 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65  s used.    *  Se
1910: 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37  e ticket [a69637
1920: 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20  9c1f08866] */.  
1930: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41    if( pParse->pA
1940: 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 65  inc!=0 && pParse
1950: 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72  ->nTab==0 ) pPar
1960: 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20  se->nTab = 1;.  
1970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
1980: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
1990: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
19a0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
19b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
19c0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
19d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
19e0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
19f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1a00: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1a20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1a30: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1a40: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1a60: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1a70: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1a80: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1a90: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1aa0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1ab0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1ac0: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1ad0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1ae0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1af0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b00: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1b10: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1b20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1b30: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1b40: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1b50: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1b60: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1b70: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1b80: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1b90: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ba0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1bb0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1bc0: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1bd0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1be0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1bf0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1c00: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1c10: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1c20: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1c30: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1c40: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1c50: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1c60: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1c70: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1c80: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1c90: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1ca0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1cb0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1cc0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ce0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1d00: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1d10: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1d20: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1d30: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1d40: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
1d50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d60: 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  b;.# define SAVE
1d70: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1d80: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1d90: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
1da0: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
1db0: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
1dc0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
1dd0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1de0: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1df0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1e00: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1e10: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1e20: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1e30: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1e40: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1e50: 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  tf(db, zFormat, 
1e60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1e70: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
1e90: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75    /* A malloc mu
1ea0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1eb0: 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  /.  }.  pParse->
1ec0: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1ed0: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1ef0: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1f00: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
1f10: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  SAVE_SZ);.  sqli
1f20: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
1f30: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
1f40: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1f50: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1f60: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f70: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
1f80: 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d   memcpy(&pParse-
1f90: 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20  >nVar, saveBuf, 
1fa0: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72  SAVE_SZ);.  pPar
1fb0: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
1fc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1fd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1fe0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1ff0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
2000: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
2010: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
2020: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
2030: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
2040: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
2050: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
2060: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2070: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
2080: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2090: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
20a0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
20b0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
20c0: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
20d0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
20e0: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
20f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
2100: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
2110: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
2120: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
2130: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2140: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
2150: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2160: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
2170: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
2180: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
2190: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
21a0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
21b0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
21c0: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
21d0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
21e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
21f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2210: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
2220: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
2230: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61    int nName;.  a
2240: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
2250: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  );.  nName = sql
2260: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
2270: 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  me);.  /* All mu
2280: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
2290: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
22a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
22b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
22c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61 74  /.  assert( zDat
22d0: 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69  abase!=0 || sqli
22e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
22f0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
2300: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2310: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2320: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2330: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2340: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2350: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2360: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2370: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2380: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2390: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
23a0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
23b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
23c0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
23d0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
23e0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
23f0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2400: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
2410: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  blHash, zName, n
2420: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
2430: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2440: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2450: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2460: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2470: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2480: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2490: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
24a0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
24b0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
24c0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
24d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
24e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
24f0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2500: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
2510: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
2520: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
2530: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2540: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2550: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2560: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2570: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2580: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2590: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
25a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
25b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
25c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
25d0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
25e0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
25f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2600: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2610: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
2620: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2630: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
2640: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
2650: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
2660: 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  View,           
2670: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b   /* True if look
2680: 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72  ing for a VIEW r
2690: 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42  ather than a TAB
26a0: 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LE */.  const ch
26b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
26c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
26d0: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
26e0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
26f0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
2700: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2710: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
2720: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
2730: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
2740: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2750: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2780: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2790: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
27a0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
27b0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
27c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
27d0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
27e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
27f0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
2800: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
2810: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
2820: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2830: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2840: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56  char *zMsg = isV
2850: 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76  iew ? "no such v
2860: 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20  iew" : "no such 
2870: 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20  table";.    if( 
2880: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28a0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
28b0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
28c0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
28d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
28e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28f0: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2900: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
2910: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
2920: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2940: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2950: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
2960: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
2970: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
2980: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
2990: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
29b0: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
29c0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
29d0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
29e0: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
29f0: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
2a00: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
2a10: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
2a20: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
2a30: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
2a40: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
2a50: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
2a60: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
2a70: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
2a80: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
2a90: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
2aa0: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
2ab0: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
2ac0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2ad0: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
2ae0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20  *pParse, .  int 
2af0: 69 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63  isView, .  struc
2b00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b10: 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  p.){.  const cha
2b20: 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74  r *zDb;.  assert
2b30: 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20  ( p->pSchema==0 
2b40: 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d  || p->zDatabase=
2b50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
2b60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e  Schema ){.    in
2b70: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2b80: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2b90: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68  rse->db, p->pSch
2ba0: 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20  ema);.    zDb = 
2bb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
2bc0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  iDb].zName;.  }e
2bd0: 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70  lse{.    zDb = p
2be0: 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d  ->zDatabase;.  }
2bf0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2c00: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
2c10: 72 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e  rse, isView, p->
2c20: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
2c30: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2c40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2c50: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2c60: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2c70: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2c80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2c90: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2ca0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2cb0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2cc0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2ce0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2cf0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2d00: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2d10: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2d20: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2d30: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2d40: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2d60: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2d70: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2d80: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2d90: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2da0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2db0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2dc0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2dd0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2de0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2df0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2e00: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2e10: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2e20: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2e30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2e40: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2e50: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2e60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2e70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2e80: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2e90: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2ea0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2eb0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2ec0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2ed0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2ee0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2ef0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2f00: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2f10: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2f20: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2f30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2f40: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2f50: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2f60: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2f70: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2f80: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2f90: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2fa0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2fb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2fc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2fd0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2fe0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ff0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3000: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3010: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
3020: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
3030: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
3040: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
3050: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
3060: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3090: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
30a0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
30b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
30c0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
30d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
30e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30f0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
3100: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
3110: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3120: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3130: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3140: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3150: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3160: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3170: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
3180: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
3190: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 43  bFree(db, p->azC
31a0: 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  oll);.  sqlite3D
31b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
31c0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
31d0: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
31e0: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
31f0: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
3200: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
3210: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
3220: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
3230: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
3240: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
3250: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
3260: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
3270: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
3280: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
3290: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
32a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
32b0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
32c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
32d0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
32e0: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
32f0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
3300: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68   int len;.  Hash
3310: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3320: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3330: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3340: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3350: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3360: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3370: 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  sh;.  len = sqli
3380: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 78  te3Strlen30(zIdx
3390: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20  Name);.  pIndex 
33a0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
33b0: 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e  ert(pHash, zIdxN
33c0: 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20  ame, len, 0);.  
33d0: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65  if( ALWAYS(pInde
33e0: 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  x) ){.    if( pI
33f0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3400: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
3410: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
3420: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
3430: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
3450: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f  ndex *p;.      /
3460: 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
3470: 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68  of ALWAYS();  Th
3480: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
3490: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20  on the list of. 
34a0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e       ** indices.
34b0: 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49   */.      p = pI
34c0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
34d0: 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
34e0: 65 28 20 41 4c 57 41 59 53 28 70 29 20 26 26 20  e( ALWAYS(p) && 
34f0: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
3500: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
3510: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ; }.      if( AL
3520: 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65  WAYS(p && p->pNe
3530: 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20  xt==pIndex) ){. 
3540: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
3550: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3570: 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c     freeIndex(db,
3580: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20   pIndex);.  }.  
3590: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
35a0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
35b0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  s;.}../*.** Look
35c0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73   through the lis
35d0: 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61  t of open databa
35e0: 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e  se files in db->
35f0: 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20  aDb[] and if.** 
3600: 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c  any have been cl
3610: 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65  osed, remove the
3620: 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e  m from the list.
3630: 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Reallocate the
3640: 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74  .** db->aDb[] st
3650: 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61  ructure to a sma
3660: 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f  ller size, if po
3670: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e  ssible..**.** En
3680: 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e  try 0 (the "main
3690: 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 20  " database) and 
36a0: 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 65  entry 1 (the "te
36b0: 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a  mp" database).**
36c0: 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69   are never candi
36d0: 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20  dates for being 
36e0: 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f  collapsed..*/.vo
36f0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  id sqlite3Collap
3700: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
3710: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
3720: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
3730: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
3740: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3750: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
3760: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3770: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
3780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3790: 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e  Free(db, pDb->zN
37a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
37b0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
37c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
37d0: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
37e0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
37f0: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
3800: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
3810: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
3820: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
3830: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
3840: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
3850: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
3860: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
3870: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
3880: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
3890: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
38a0: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
38b0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
38c0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ));.    sqlite3D
38d0: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
38e0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
38f0: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
3900: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
3910: 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66  set the schema f
3920: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
3930: 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41  at index iDb.  A
3940: 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a  lso reset the.**
3950: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f   TEMP schema..*/
3960: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
3970: 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69  etOneSchema(sqli
3980: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3990: 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  ){.  Db *pDb;.  
39a0: 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
39b0: 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73  nDb );..  /* Cas
39c0: 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65 20  e 1:  Reset the 
39d0: 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64  single schema id
39e0: 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62 20  entified by iDb 
39f0: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
3a00: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65  aDb[iDb];.  asse
3a10: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3a20: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3a30: 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65  Db, 0) );.  asse
3a40: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
3a50: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
3a60: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
3a70: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a  >pSchema);..  /*
3a80: 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   If any database
3a90: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50   other than TEMP
3aa0: 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20   is reset, then 
3ab0: 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a  also reset TEMP.
3ac0: 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20    ** since TEMP 
3ad0: 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67  might be holding
3ae0: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 72   triggers that r
3af0: 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20  eference tables 
3b00: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  in the.  ** othe
3b10: 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  r database..  */
3b20: 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b  .  if( iDb!=1 ){
3b30: 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  .    pDb = &db->
3b40: 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65  aDb[1];.    asse
3b50: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
3b60: 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
3b70: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
3b80: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
3b90: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
3ba0: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
3bb0: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
3bc0: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
3bd0: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
3be0: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
3bf0: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
3c00: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
3c10: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
3c20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3c30: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
3c40: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
3c50: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
3c60: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3c70: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
3c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
3c90: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
3ca0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3cb0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3cc0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
3cd0: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
3ce0: 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65  Clear(pDb->pSche
3cf0: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ma);.    }.  }. 
3d00: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3d10: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3d20: 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  ges;.  sqlite3Vt
3d30: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
3d40: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3d50: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
3d60: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
3d70: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
3d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3d90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3da0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
3db0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
3dc0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
3dd0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
3de0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
3df0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
3e00: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
3e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
3e20: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
3e30: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
3e40: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
3e50: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
3e60: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
3e70: 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rray)..*/.static
3e80: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
3e90: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71  teColumnNames(sq
3ea0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
3eb0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
3ec0: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
3ed0: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
3ee0: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
3ef0: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
3f00: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
3f10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
3f20: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
3f30: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
3f40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3f50: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
3f60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3f70: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
3f80: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  pDflt);.      sq
3f90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3fa0: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
3fb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3fc0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70  e(db, pCol->zTyp
3fd0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
3fe0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
3ff0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
4000: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4010: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
4020: 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ol);.  }.}../*.*
4030: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
4040: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
4050: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
4060: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
4070: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
4080: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
4090: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
40a0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
40b0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
40c0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
40d0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
40e0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
40f0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
4100: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
4110: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
4120: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
4130: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
4140: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
4150: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4160: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
4170: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
4180: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
4190: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
41a0: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20  s optional.  It 
41b0: 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  is needed if the
41c0: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a   Table object .*
41d0: 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61  * contains looka
41e0: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54  side memory.  (T
41f0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
4200: 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f  the schema do no
4210: 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69  t use.** lookasi
4220: 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73  de memory, but s
4230: 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61  ome ephemeral Ta
4240: 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29  ble objects do.)
4250: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70    Or the.** db p
4260: 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
4270: 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e  used with db->pn
4280: 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65  BytesFreed to me
4290: 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  asure the memory
42a0: 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20  .** used by the 
42b0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
42c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
42d0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
42e0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
42f0: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
4300: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
4310: 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e   TESTONLY( int n
4320: 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20  Lookaside; ) /* 
4330: 55 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c  Used to verify l
4340: 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65  ookaside not use
4350: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a  d for schema */.
4360: 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61 62  .  assert( !pTab
4370: 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52  le || pTable->nR
4380: 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f  ef>0 );..  /* Do
4390: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
43a0: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
43b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
43c0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
43d0: 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29  .  if( !pTable )
43e0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
43f0: 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  (!db || db->pnBy
4400: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
4410: 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29  (--pTable->nRef)
4420: 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  >0) ) return;.. 
4430: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
4440: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
4450: 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61  ding lookaside a
4460: 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63  llocations in sc
4470: 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a  hema Tables.  **
4480: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
4490: 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72 61  any free() opera
44a0: 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63  tions.  Since sc
44b0: 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e  hema Tables do n
44c0: 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b  ot use.  ** look
44d0: 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62  aside, this numb
44e0: 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68  er should not ch
44f0: 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f  ange. */.  TESTO
4500: 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20  NLY( nLookaside 
4510: 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c 65  = (db && (pTable
4520: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
4530: 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f  Ephemeral)==0) ?
4540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4550: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f            db->lo
4560: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30  okaside.nOut : 0
4570: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
4580: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4590: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
45a0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
45b0: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
45c0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
45d0: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
45e0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
45f0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4600: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4610: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4620: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
4630: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
4640: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
4650: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
4660: 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a  Name = pIndex->z
4670: 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53  Name; .      TES
4680: 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70  TONLY ( Index *p
4690: 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48  Old = ) sqlite3H
46a0: 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20  ashInsert(.     
46b0: 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63      &pIndex->pSc
46c0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
46d0: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
46e0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30 0a  len30(zName), 0.
46f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4700: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4710: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4720: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4730: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4740: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4750: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4760: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4770: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4780: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4790: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
47a0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
47b0: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
47c0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
47d0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
47e0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
47f0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4800: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4810: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65  .  */.  sqliteDe
4820: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4830: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
4840: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4850: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
4860: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4870: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
4880: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
4890: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
48a0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
48b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
48c0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73  E_OMIT_CHECK.  s
48d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
48e0: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
48f0: 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66  >pCheck);.#endif
4900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4910: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4920: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
4930: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
4940: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
4950: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4960: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
4970: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
4980: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
4990: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
49a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
49b0: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
49c0: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
49d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
49e0: 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ut );.}../*.** U
49f0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
4a00: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
4a10: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
4a20: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
4a30: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
4a40: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
4a50: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
4a60: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
4a70: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
4a80: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4a90: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
4aa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
4ab0: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
4ac0: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
4ad0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
4ae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
4af0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
4b00: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
4b10: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
4b20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4b30: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4b40: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
4b50: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
4b60: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
4b70: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
4b80: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
4b90: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
4ba0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
4bb0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
4bc0: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4bd0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
4be0: 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  bName,.         
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4c00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4c10: 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73  TabName),0);.  s
4c20: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
4c30: 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e  e(db, p);.  db->
4c40: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
4c50: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
4c60: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
4c70: 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20  token, return a 
4c80: 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73  string that cons
4c90: 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74  ists of the text
4ca0: 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65   of that.** toke
4cb0: 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
4cc0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
4cd0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
4ce0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4cf0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
4d00: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
4d10: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
4d20: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ction..**.** Any
4d30: 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73   quotation marks
4d40: 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27   (ex:  "name", '
4d50: 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f  name', [name], o
4d60: 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a  r `name`) that.*
4d70: 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62  * surround the b
4d80: 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ody of the token
4d90: 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a   are removed..**
4da0: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f  .** Tokens are o
4db0: 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65  ften just pointe
4dc0: 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  rs into the orig
4dd0: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e  inal SQL text an
4de0: 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  d so.** are not 
4df0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4e00: 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73  and are not pers
4e10: 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74  istent.  The ret
4e20: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4e30: 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  is \000 terminat
4e40: 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73  ed and is persis
4e50: 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tent..*/.char *s
4e60: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4e70: 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ken(sqlite3 *db,
4e80: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4e90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4ea0: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
4eb0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
4ec0: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
4ed0: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
4ee0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
4ef0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
4f00: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
4f10: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
4f20: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
4f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
4f40: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
4f50: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
4f60: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
4f70: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
4f80: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
4f90: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
4fa0: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
4fb0: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
4fc0: 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a  terTable(Parse *
4fd0: 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  p, int iDb){.  V
4fe0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
4ff0: 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71  GetVdbe(p);.  sq
5000: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
5010: 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f  , iDb, MASTER_RO
5020: 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41  OT, 1, SCHEMA_TA
5030: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c  BLE(iDb));.  sql
5040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5050: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
5060: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
5070: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
5080: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
5090: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
50a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
50b0: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
50c0: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
50d0: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
50e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
50f0: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5100: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5110: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5120: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5130: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5140: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5150: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5160: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5170: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5180: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
5190: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
51a0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
51b0: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
51c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
51d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
51e0: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
51f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5200: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5210: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5220: 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20  b *pDb;.    int 
5230: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5240: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
5250: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
5260: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
5270: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
5280: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
5290: 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c   (!OMIT_TEMPDB |
52a0: 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73  | i!=1 ) && n==s
52b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
52c0: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  Db->zName) && . 
52d0: 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
52e0: 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e  te3StrICmp(pDb->
52f0: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  zName, zName) ){
5300: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5320: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
5330: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
5340: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
5350: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
5360: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
5370: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
5380: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
5390: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
53a0: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
53b0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
53c0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
53d0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
53e0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
53f0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5400: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
5410: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
5420: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
5430: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5440: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5470: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
5480: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
54b0: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
54c0: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
54d0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
54e0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
54f0: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
5500: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
5510: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
5520: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
5530: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
5540: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
5550: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
5560: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
5570: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5580: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
5590: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
55a0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
55b0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
55c0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
55d0: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
55e0: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
55f0: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
5600: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5610: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5620: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5630: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5640: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
5650: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
5660: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
5670: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
5680: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
5690: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
56a0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
56b0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
56c0: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
56d0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
56e0: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
56f0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5700: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5710: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
5720: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
5730: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
5740: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
5750: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5760: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
5770: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
5780: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
5790: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
57a0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
57b0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
57c0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
57d0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
57e0: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
57f0: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
5800: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
5810: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
5820: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
5830: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
5840: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
5850: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
5860: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
5870: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
5880: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
5890: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
58a0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
58b0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
58c0: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
58d0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
58e0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
58f0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  >db;..  if( ALWA
5900: 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26  YS(pName2!=0) &&
5910: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5920: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5930: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5940: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5950: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5960: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5970: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
5980: 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
5990: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  -1;.    }.    *p
59a0: 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b  Unqual = pName2;
59b0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
59c0: 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61  e3FindDb(db, pNa
59d0: 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44  me1);.    if( iD
59e0: 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  b<0 ){.      sql
59f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5a00: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  rse, "unknown da
5a10: 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d  tabase %T", pNam
5a20: 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  e1);.      pPars
5a30: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
5a40: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5a50: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
5a60: 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e  ssert( db->init.
5a70: 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e  iDb==0 || db->in
5a80: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69  it.busy );.    i
5a90: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
5aa0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
5ab0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
5ac0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
5ad0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5ae0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
5af0: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
5b00: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
5b10: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
5b20: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
5b30: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
5b40: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
5b50: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
5b60: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
5b70: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
5b80: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
5b90: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
5ba0: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
5bb0: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
5bc0: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
5bd0: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
5be0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
5bf0: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
5c00: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
5c10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
5c20: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
5c30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
5c40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
5c50: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
5c60: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
5c70: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
5c80: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
5c90: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
5ca0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
5cb0: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
5cc0: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
5cd0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
5ce0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
5cf0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
5d00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5d10: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
5d20: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
5d30: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
5d40: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
5d50: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
5d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5d70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5d80: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
5d90: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
5da0: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
5db0: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
5dc0: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
5dd0: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
5de0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
5df0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70  ->pIndex; p && p
5e00: 2d 3e 61 75 74 6f 49 6e 64 65 78 21 3d 32 3b 20  ->autoIndex!=2; 
5e10: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
5e20: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
5e30: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
5e40: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
5e50: 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  dx that correspo
5e60: 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20  nds to table.** 
5e70: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65  column iCol.  Re
5e80: 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66  turn -1 if not f
5e90: 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c  ound..*/.i16 sql
5ea0: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
5eb0: 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  x(Index *pIdx, i
5ec0: 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  16 iCol){.  int 
5ed0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5ee0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
5ef0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f  ++){.    if( iCo
5f00: 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  l==pIdx->aiColum
5f10: 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b  n[i] ) return i;
5f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
5f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
5f40: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
5f50: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
5f60: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
5f70: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
5f80: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
5f90: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
5fa0: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
5fb0: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
5fc0: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
5fd0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
5fe0: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
5ff0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6000: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
6010: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
6020: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
6030: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
6040: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
6050: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
6060: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
6070: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
6080: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
6090: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
60a0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
60b0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
60c0: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
60d0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
60e0: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
60f0: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
6100: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
6110: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
6120: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
6130: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
6140: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
6150: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
6160: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
6170: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
6180: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
6190: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
61a0: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
61b0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
61c0: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
61d0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
61e0: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
61f0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
6200: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
6210: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
6220: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6230: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
6240: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
6250: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
6260: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
6270: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
6280: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6290: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
62a0: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
62b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
62c0: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
62d0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
62e0: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
62f0: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
6300: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6310: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
6320: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
6330: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
6340: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6350: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6360: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
6370: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6380: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
6390: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
63a0: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
63b0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
63c0: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
63d0: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
63e0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
63f0: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
6400: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
6410: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
6420: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
6430: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
6440: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
6450: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
6460: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
6470: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
6480: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
6490: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
64a0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
64b0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
64c0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
64d0: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
64e0: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
64f0: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
6500: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
6510: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
6520: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f  o create */..  /
6530: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
6540: 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61  iew name to crea
6550: 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  te is passed to 
6560: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
6570: 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61   tokens.  ** pNa
6580: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
6590: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
65a0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
65b0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
65c0: 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  le:.  **.  ** CR
65d0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
65e0: 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a  yy (...);.  ** .
65f0: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
6600: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
6610: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
6620: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
6630: 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65  hand if.  ** the
6640: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e   table name is n
6650: 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  ot fully qualifi
6660: 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20  ed, i.e.:.  **. 
6670: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
6680: 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a   yyy(...);.  **.
6690: 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31    ** Then pName1
66a0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
66b0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
66c0: 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  "..  **.  ** The
66d0: 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73   call below sets
66e0: 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74   the pName point
66f0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
6700: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
6710: 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29   or.  ** pName2)
6720: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
6730: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
6740: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72  le name. The var
6750: 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a  iable iDb is.  *
6760: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  * set to the ind
6770: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
6780: 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  se that the tabl
6790: 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20  e or view is to 
67a0: 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
67b0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d  in..  */.  iDb =
67c0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
67d0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
67e0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
67f0: 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
6800: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6810: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6820: 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d 65   isTemp && pName
6830: 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d 31  2->n>0 && iDb!=1
6840: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72   ){.    /* If cr
6850: 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61  eating a temp ta
6860: 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61  ble, the name ma
6870: 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69  y not be qualifi
6880: 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20 20  ed. Unless .    
6890: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
68a0: 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61  name is "temp" a
68b0: 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 73  nyway.  */.    s
68c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
68d0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
68e0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
68f0: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
6900: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
6910: 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f    }.  if( !OMIT_
6920: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6930: 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70   ) iDb = 1;..  p
6940: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
6950: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e  n = *pName;.  zN
6960: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
6970: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
6980: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
6990: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
69a0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
69b0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
69c0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
69d0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
69e0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
69f0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
6a00: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
6a10: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
6a20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6a30: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
6a40: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
6a50: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
6a60: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
6a70: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
6a80: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
6a90: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
6aa0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
6ab0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
6ac0: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
6ad0: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
6ae0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
6af0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6b00: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6b10: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
6b20: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
6b30: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
6b40: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
6b50: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6b60: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
6b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6b80: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6b90: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
6ba0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6bb0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
6bc0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
6bd0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6be0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6bf0: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
6c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6c10: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6c20: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
6c30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
6c40: 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20  ( !isVirtual && 
6c50: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
6c60: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
6c70: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
6c80: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6c90: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6ca0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
6cb0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
6cc0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
6cd0: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
6ce0: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
6cf0: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
6d00: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
6d10: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
6d20: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
6d30: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
6d40: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65   ** it does. The
6d50: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
6d60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62   the statement b
6d70: 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20  eing parsed was 
6d80: 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61  passed.  ** to a
6d90: 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
6da0: 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49  e_vtab() call. I
6db0: 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
6dc0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
6dd0: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73  s.  ** and types
6de0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73   will be used, s
6df0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
6e00: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e  ed to test for n
6e10: 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f  amespace.  ** co
6e20: 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  llisions..  */. 
6e30: 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45   if( !IN_DECLARE
6e40: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 63 68 61  _VTAB ){.    cha
6e50: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
6e60: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
6e70: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
6e80: 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
6e90: 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
6ea0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6eb0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6ec0: 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71  .    pTable = sq
6ed0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
6ee0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  b, zName, zDb);.
6ef0: 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29      if( pTable )
6f00: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45  {.      if( !noE
6f10: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
6f20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6f30: 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20  arse, "table %T 
6f40: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
6f50: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   pName);.      }
6f60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
6f70: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
6f80: 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20  busy );.        
6f90: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
6fa0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
6fb0: 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
6fc0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6fd0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6fe0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
6ff0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
7000: 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b  Name, zDb)!=0 ){
7010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
7020: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7030: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
7040: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
7050: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
7060: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7070: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
7080: 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d  .  }..  pTable =
7090: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
70a0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
70b0: 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
70c0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
70d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
70e0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   = 1;.    pParse
70f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
7100: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
7110: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
7120: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7130: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
7140: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
7150: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
7160: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
7170: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
7180: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
7190: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
71a0: 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 1;.  pTable->
71b0: 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37  nRowEst = 104857
71c0: 36 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  6;.  assert( pPa
71d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
71e0: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70  0 );.  pParse->p
71f0: 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  NewTable = pTabl
7200: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
7210: 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71   is the magic sq
7220: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
7230: 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f  ble used by auto
7240: 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20  increment,.  ** 
7250: 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f  then record a po
7260: 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61  inter to this ta
7270: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
7280: 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
7290: 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  re.  ** so that 
72a0: 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20  INSERT can find 
72b0: 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79  the table easily
72c0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
72d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
72e0: 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NCREMENT.  if( !
72f0: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26  pParse->nested &
7300: 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  & strcmp(zName, 
7310: 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  "sqlite_sequence
7320: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ")==0 ){.    ass
7330: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
7340: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
7350: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
7360: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
7370: 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65  pSeqTab = pTable
7380: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
7390: 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
73a0: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
73b0: 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68  t will insert th
73c0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  e table record i
73d0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  nto.  ** the SQL
73e0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
73f0: 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69  .  Note in parti
7400: 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75  cular that we mu
7410: 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a  st go ahead.  **
7420: 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68   and allocate th
7430: 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20  e record number 
7440: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e  for the table en
7450: 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65  try now.  Before
7460: 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52   any.  ** PRIMAR
7470: 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
7480: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72  keywords are par
7490: 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77  sed.  Those keyw
74a0: 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a  ords will cause.
74b0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
74c0: 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74  be created and t
74d0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
74e0: 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65  must come before
74f0: 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63   the .  ** indic
7500: 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  es.  Hence, the 
7510: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
7520: 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74  r the table must
7530: 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20   be allocated.  
7540: 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  ** now..  */.  i
7550: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
7560: 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65  y && (v = sqlite
7570: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
7580: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
7590: 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65  j1;.    int file
75a0: 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  Format;.    int 
75b0: 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33  reg1, reg2, reg3
75c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
75d0: 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
75e0: 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
75f0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
7600: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7610: 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69  BLE.    if( isVi
7620: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
7630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7640: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a  (v, OP_VBegin);.
7650: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
7660: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
7670: 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f   format and enco
7680: 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61  ding in the data
7690: 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65  base have not be
76a0: 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20  en set, .    ** 
76b0: 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20  set them now..  
76c0: 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20    */.    reg1 = 
76d0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
76e0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
76f0: 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50  m;.    reg2 = pP
7700: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20  arse->regRoot = 
7710: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7720: 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61      reg3 = ++pPa
7730: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
7740: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7750: 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
7760: 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54  e, iDb, reg3, BT
7770: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29  REE_FILE_FORMAT)
7780: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7790: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
77a0: 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  b);.    j1 = sql
77b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
77c0: 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a  , OP_If, reg3);.
77d0: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
77e0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
77f0: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
7800: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
7810: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
7820: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
7830: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
7840: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7850: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65  OP_Integer, file
7860: 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20  Format, reg3);. 
7870: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7880: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
7890: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
78a0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65  _FILE_FORMAT, re
78b0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
78c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
78d0: 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62  _Integer, ENC(db
78e0: 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  ), reg3);.    sq
78f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7900: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
7910: 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54   iDb, BTREE_TEXT
7920: 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29  _ENCODING, reg3)
7930: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7940: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
7950: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a  ;..    /* This j
7960: 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c  ust creates a pl
7970: 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72  ace-holder recor
7980: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  d in the sqlite_
7990: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
79a0: 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20    ** The record 
79b0: 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74  created does not
79c0: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e   contain anythin
79d0: 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20  g yet.  It will 
79e0: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20  be replaced.    
79f0: 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65  ** by the real e
7a00: 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e  ntry in code gen
7a10: 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65  erated at sqlite
7a20: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20  3EndTable()..   
7a30: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
7a40: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77  owid for the new
7a50: 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69   entry is left i
7a60: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
7a70: 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20  e->regRowid..   
7a80: 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   ** The root pag
7a90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
7aa0: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66  new table is lef
7ab0: 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d  t in reg pParse-
7ac0: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
7ad0: 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72   The rowid and r
7ae0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
7af0: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65  values are neede
7b00: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
7b10: 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  at.    ** sqlite
7b20: 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67  3EndTable will g
7b30: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
7b40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7b50: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
7b60: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
7b70: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7b80: 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56  BLE).    if( isV
7b90: 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c  iew || isVirtual
7ba0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7bb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7bc0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
7bd0: 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g2);.    }else.#
7be0: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
7bf0: 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72    pParse->addrCr
7c00: 54 61 62 20 3d 20 28 75 31 36 29 73 71 6c 69 74  Tab = (u16)sqlit
7c10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7c20: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20  OP_CreateTable, 
7c30: 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20  iDb, reg2);.    
7c40: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
7c50: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
7c60: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
7c70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7c80: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
7c90: 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73   0, reg1);.    s
7ca0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7cb0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
7cc0: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
7cd0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7ce0: 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65  OP_Insert, 0, re
7cf0: 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73  g3, reg1);.    s
7d00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7d10: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
7d20: 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  END);.    sqlite
7d30: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
7d40: 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20  P_Close);.  }.. 
7d50: 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d   /* Normal (non-
7d60: 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a  error) return. *
7d70: 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  /.  return;..  /
7d80: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
7d90: 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65  curs, we jump he
7da0: 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c  re */.begin_tabl
7db0: 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  e_error:.  sqlit
7dc0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
7dd0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
7de0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
7df0: 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ro is used to co
7e00: 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67  mpare two string
7e10: 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65  s in a case-inse
7e20: 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a  nsitive manner..
7e30: 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c  ** It is slightl
7e40: 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61  y faster than ca
7e50: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72  lling sqlite3Str
7e60: 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c  ICmp() directly,
7e70: 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73   but.** produces
7e80: 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a   larger code..**
7e90: 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69  .** WARNING: Thi
7ea0: 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63  s macro is not c
7eb0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
7ec0: 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69  he strcmp() fami
7ed0: 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e  ly. It.** return
7ee0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77  s true if the tw
7ef0: 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71  o strings are eq
7f00: 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66  ual, otherwise f
7f10: 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  alse..*/.#define
7f20: 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28   STRICMP(x, y) (
7f30: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
7f40: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
7f50: 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20   char *)(x)]==  
7f60: 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54   \.sqlite3UpperT
7f70: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
7f80: 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20  d char *)(y)]   
7f90: 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74    \.&& sqlite3St
7fa0: 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b  rICmp((x)+1,(y)+
7fb0: 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41  1)==0 )../*.** A
7fc0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
7fd0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
7fe0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
7ff0: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
8000: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
8010: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
8020: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
8030: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
8040: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
8050: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8060: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
8070: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
8080: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
8090: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
80a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
80b0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
80c0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
80d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
80e0: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
80f0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
8100: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
8110: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
8120: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
8130: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
8140: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8150: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
8160: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
8170: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
8180: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
8190: 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c  MN.  if( p->nCol
81a0: 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  +1>db->aLimit[SQ
81b0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
81c0: 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
81d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
81e0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
81f0: 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a  mns on %s", p->z
8200: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
8210: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
8220: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
8230: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
8240: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
8250: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8260: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
8270: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54  i++){.    if( ST
8280: 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c  RICMP(z, p->aCol
8290: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  [i].zName) ){.  
82a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
82b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
82c0: 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  licate column na
82d0: 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  me: %s", z);.   
82e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
82f0: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
8300: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
8310: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20  .  if( (p->nCol 
8320: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
8330: 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20   Column *aNew;. 
8340: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
8350: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d  3DbRealloc(db,p-
8360: 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38  >aCol,(p->nCol+8
8370: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c  )*sizeof(p->aCol
8380: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
8390: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
83a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
83b0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
83c0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
83d0: 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20  >aCol = aNew;.  
83e0: 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  }.  pCol = &p->a
83f0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20  Col[p->nCol];.  
8400: 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20  memset(pCol, 0, 
8410: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
8420: 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61  ]));.  pCol->zNa
8430: 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49  me = z;. .  /* I
8440: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
8450: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
8460: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
8470: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
8480: 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20    ** 'NONE'. If 
8490: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
84a0: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
84b0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
84c0: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
84d0: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
84e0: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
84f0: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
8500: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
8510: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
8520: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c  AFF_NONE;.  pCol
8530: 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 70  ->szEst = 1;.  p
8540: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nCol++;.}../*.
8550: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8560: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
8570: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
8580: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
8590: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
85a0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
85b0: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
85c0: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
85d0: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
85e0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
85f0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
8600: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
8610: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
8620: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8630: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
8640: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8650: 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70  NotNull(Parse *p
8660: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
8670: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  or){.  Table *p;
8680: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
8690: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
86a0: 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d  p==0 || NEVER(p-
86b0: 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72  >nCol<1) ) retur
86c0: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  n;.  p->aCol[p->
86d0: 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20  nCol-1].notNull 
86e0: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d  = (u8)onError;.}
86f0: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
8700: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
8710: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
8720: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
8730: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
8740: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
8750: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8760: 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73  utine does a cas
8770: 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  e-independent se
8780: 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f  arch of zType fo
8790: 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72  r the .** substr
87a0: 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ings in the foll
87b0: 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20  owing table. If 
87c0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
87d0: 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e  rings is.** foun
87e0: 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  d, the correspon
87f0: 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73  ding affinity is
8800: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54   returned. If zT
8810: 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ype contains.** 
8820: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66  more than one of
8830: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c   the substrings,
8840: 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20   entries toward 
8850: 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74  the top of .** t
8860: 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72  he table take pr
8870: 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d  iority. For exam
8880: 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73  ple, if zType is
8890: 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20   'BLOBINT', .** 
88a0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
88b0: 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ER is returned..
88c0: 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20  **.** Substring 
88d0: 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a      | Affinity.*
88e0: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
88f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8900: 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20  --.** 'INT'     
8910: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8920: 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41  _INTEGER.** 'CHA
8930: 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  R'        | SQLI
8940: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
8950: 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  CLOB'        | S
8960: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
8970: 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20  * 'TEXT'        
8980: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
8990: 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20  T.** 'BLOB'     
89a0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
89b0: 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20  NONE.** 'REAL'  
89c0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
89d0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41  FF_REAL.** 'FLOA
89e0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
89f0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44  E_AFF_REAL.** 'D
8a00: 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  OUB'        | SQ
8a10: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
8a20: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74  .** If none of t
8a30: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  he substrings in
8a40: 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65   the above table
8a50: 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53   are found,.** S
8a60: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8a70: 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  C is returned..*
8a80: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
8a90: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
8aa0: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a   char *zIn, u8 *
8ab0: 70 73 7a 45 73 74 29 7b 0a 20 20 75 33 32 20 68  pszEst){.  u32 h
8ac0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
8ad0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
8ae0: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
8af0: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
8b00: 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20  .  if( zIn==0 ) 
8b10: 72 65 74 75 72 6e 20 61 66 66 3b 0a 20 20 77 68  return aff;.  wh
8b20: 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20  ile( zIn[0] ){. 
8b30: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
8b40: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
8b50: 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d  wer[(*zIn)&0xff]
8b60: 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20  ;.    zIn++;.   
8b70: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
8b80: 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61  4)+('h'<<16)+('a
8b90: 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20  '<<8)+'r') ){   
8ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
8bb0: 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  R */.      aff =
8bc0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8bd0: 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20  ;.      zChar = 
8be0: 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  zIn;.    }else i
8bf0: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
8c00: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
8c10: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
8c20: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
8c30: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8c40: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
8c50: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
8c60: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
8c70: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
8c80: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
8c90: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
8ca0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
8cb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8cc0: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
8cd0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
8ce0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
8cf0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
8d00: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
8d10: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
8d20: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
8d30: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
8d40: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
8d50: 4e 45 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49  NE;.      if( zI
8d60: 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61  n[0]=='(' ) zCha
8d70: 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66  r = zIn;.#ifndef
8d80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
8d90: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
8da0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8db0: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
8dc0: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
8dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
8de0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
8df0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
8e00: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
8e10: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8e20: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
8e30: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
8e40: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
8e50: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
8e60: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
8e70: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8e80: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8e90: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8ea0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8eb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8ec0: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
8ed0: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
8ee0: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
8ef0: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
8f00: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8f10: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8f20: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8f30: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
8f40: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
8f50: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
8f60: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
8f70: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
8f80: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
8f90: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8fa0: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
8fb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8fc0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45 73  }..  /* If pszEs
8fd0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  t is not NULL, s
8fe0: 74 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65  tore an estimate
8ff0: 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73 69   of the field si
9000: 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73  ze.  The.  ** es
9010: 74 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64  timate is scaled
9020: 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a   so that the siz
9030: 65 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  e of an integer 
9040: 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20  is 1.  */.  if( 
9050: 70 73 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a 70  pszEst ){.    *p
9060: 73 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20  szEst = 1;   /* 
9070: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20  default size is 
9080: 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a  approx 4 bytes *
9090: 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 3d 53  /.    if( aff<=S
90a0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
90b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68 61  {.      if( zCha
90c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  r ){.        whi
90d0: 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a  le( zChar[0] ){.
90e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
90f0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 43 68  lite3Isdigit(zCh
9100: 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  ar[0]) ){.      
9110: 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b        int v = 0;
9120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9130: 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68  ite3GetInt32(zCh
9140: 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20  ar, &v);.       
9150: 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31       v = v/4 + 1
9160: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
9170: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
9180: 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  5;.            *
9190: 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42  pszEst = v; /* B
91a0: 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28  LOB(k), VARCHAR(
91b0: 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72  k), CHAR(k) -> r
91c0: 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20  =(k/4+1) */.    
91d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
91e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
91f0: 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20       zChar++;.  
9200: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
9210: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 73  lse{.        *ps
9220: 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42  zEst = 5;   /* B
9230: 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20  LOB, TEXT, CLOB 
9240: 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20  -> r=5  (approx 
9250: 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20  20 bytes)*/.    
9260: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9270: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
9280: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9290: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
92a0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
92b0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
92c0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
92d0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
92e0: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
92f0: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
9300: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
9310: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
9320: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
9330: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
9340: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
9350: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
9360: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
9370: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
9380: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
9390: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
93a0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
93b0: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
93c0: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
93d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
93e0: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
93f0: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
9400: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
9410: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
9420: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
9430: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
9440: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
9450: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9460: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a   Column *pCol;..
9470: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9480: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9490: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
94a0: 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e  nCol<1) ) return
94b0: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
94c0: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a  Col[p->nCol-1];.
94d0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
94e0: 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20 70 43  zType==0 );.  pC
94f0: 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69  ol->zType = sqli
9500: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
9510: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 79  (pParse->db, pTy
9520: 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66  pe);.  pCol->aff
9530: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41  inity = sqlite3A
9540: 66 66 69 6e 69 74 79 54 79 70 65 28 70 43 6f 6c  ffinityType(pCol
9550: 2d 3e 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e  ->zType, &pCol->
9560: 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  szEst);.}../*.**
9570: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
9580: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
9590: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
95a0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
95b0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
95c0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
95d0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
95e0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
95f0: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
9600: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
9610: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
9620: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
9630: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
9640: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
9650: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9660: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
9670: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
9680: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9690: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
96a0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
96b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
96c0: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
96d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
96e0: 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20  rSpan *pSpan){. 
96f0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
9700: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
9710: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9720: 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61  e->db;.  p = pPa
9730: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9740: 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
9750: 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43    pCol = &(p->aC
9760: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  ol[p->nCol-1]);.
9770: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
9780: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
9790: 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e  Function(pSpan->
97a0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
97b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
97c0: 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74  pParse, "default
97d0: 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e   value of column
97e0: 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e   [%s] is not con
97f0: 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20  stant",.        
9800: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a    pCol->zName);.
9810: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9820: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45   /* A copy of pE
9830: 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74  xpr is used inst
9840: 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ead of the origi
9850: 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f  nal, as pExpr co
9860: 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
9870: 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e  tokens that poin
9880: 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65  t to volatile me
9890: 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27  mory. The 'span'
98a0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
98b0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72  on.      ** is r
98c0: 65 71 75 69 72 65 64 20 62 79 20 70 72 61 67 6d  equired by pragm
98d0: 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20  a table_info..  
98e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
98f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
9900: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
9910: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66  .      pCol->pDf
9920: 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
9930: 44 75 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70  Dup(db, pSpan->p
9940: 45 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52 45  Expr, EXPRDUP_RE
9950: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  DUCE);.      sql
9960: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9970: 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20  Col->zDflt);.   
9980: 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d     pCol->zDflt =
9990: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
99a0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
99b0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
99f0: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
9a00: 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rt));.    }.  }.
9a10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9a20: 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70  ete(db, pSpan->p
9a30: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
9a40: 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50 52  Designate the PR
9a50: 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68  IMARY KEY for th
9a60: 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20  e table.  pList 
9a70: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d  is a list of nam
9a80: 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e  es .** of column
9a90: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
9aa0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
9ab0: 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20   pList is NULL, 
9ac0: 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74  then the.** most
9ad0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
9ae0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61  column of the ta
9af0: 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d 61  ble is the prima
9b00: 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20  ry key..**.** A 
9b10: 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61  table can have a
9b20: 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61  t most one prima
9b30: 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20  ry key.  If the 
9b40: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
9b50: 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b  s.** a primary k
9b60: 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73 20  ey (and this is 
9b70: 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61  the second prima
9b80: 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65  ry key) then cre
9b90: 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e  ate an.** error.
9ba0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52  .**.** If the PR
9bb0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20  IMARY KEY is on 
9bc0: 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
9bd0: 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20 69  whose datatype i
9be0: 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68  s INTEGER,.** th
9bf0: 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74  en we will try t
9c00: 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d  o use that colum
9c10: 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20  n as the rowid. 
9c20: 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69   Set the Table.i
9c30: 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  PKey.** field of
9c40: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
9c50: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f   construction to
9c60: 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66   be the index of
9c70: 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20   the.** INTEGER 
9c80: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
9c90: 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79  mn.  Table.iPKey
9ca0: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66   is set to -1 if
9cb0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
9cc0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9cd0: 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  KEY..**.** If th
9ce0: 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20  e key is not an 
9cf0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9d00: 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65  KEY, then create
9d10: 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64   a unique.** ind
9d20: 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20  ex for the key. 
9d30: 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65   No index is cre
9d40: 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52  ated for INTEGER
9d50: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a   PRIMARY KEYs..*
9d60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
9d70: 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50  dPrimaryKey(.  P
9d80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9d90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9da0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9db0: 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  t *pList,  /* Li
9dc0: 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65  st of field name
9dd0: 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
9de0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
9df0: 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  ,      /* What t
9e00: 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71  o do with a uniq
9e10: 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20  ueness conflict 
9e20: 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63  */.  int autoInc
9e30: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
9e40: 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d  f the AUTOINCREM
9e50: 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  ENT keyword is p
9e60: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
9e70: 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a  sortOrder     /*
9e80: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f   SQLITE_SO_ASC o
9e90: 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  r SQLITE_SO_DESC
9ea0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
9eb0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
9ec0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72  NewTable;.  char
9ed0: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
9ee0: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b  nt iCol = -1, i;
9ef0: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20  .  int nTerm;.  
9f00: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49  if( pTab==0 || I
9f10: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
9f20: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
9f30: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
9f40: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
9f50: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
9f60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9f70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
9f80: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
9f90: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
9fa0: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
9fb0: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
9fc0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
9fd0: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
9fe0: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
9ff0: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
a000: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
a010: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
a020: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
a030: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
a040: 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67  ol[iCol].colFlag
a050: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49  s |= COLFLAG_PRI
a060: 4d 4b 45 59 3b 0a 20 20 20 20 7a 54 79 70 65 20  MKEY;.    zType 
a070: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
a080: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 6e 54  l].zType;.    nT
a090: 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  erm = 1;.  }else
a0a0: 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c  {.    nTerm = pL
a0b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
a0c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
a0d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
a0e0: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
a0f0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
a100: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
a110: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
a120: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
a130: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
a140: 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  l].zName)==0 ){.
a150: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
a160: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c  aCol[iCol].colFl
a170: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50  ags |= COLFLAG_P
a180: 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  RIMKEY;.        
a190: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
a1a0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
a1b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
a1c0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
a1d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a1e0: 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20   if( nTerm==1.  
a1f0: 20 26 26 20 7a 54 79 70 65 20 26 26 20 73 71 6c   && zType && sql
a200: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70  ite3StrICmp(zTyp
a210: 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30  e, "INTEGER")==0
a220: 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72  .   && sortOrder
a230: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 0a  ==SQLITE_SO_ASC.
a240: 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69    ){.    pTab->i
a250: 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  PKey = iCol;.   
a260: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d   pTab->keyConf =
a270: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
a280: 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e    assert( autoIn
a290: 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d  c==0 || autoInc=
a2a0: 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  =1 );.    pTab->
a2b0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f  tabFlags |= auto
a2c0: 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65  Inc*TF_Autoincre
a2d0: 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  ment;.    if( pL
a2e0: 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50  ist ) pParse->iP
a2f0: 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  kSortOrder = pLi
a300: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
a310: 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  er;.  }else if( 
a320: 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64  autoInc ){.#ifnd
a330: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
a340: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
a350: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a360: 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e  (pParse, "AUTOIN
a370: 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20  CREMENT is only 
a380: 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a  allowed on an ".
a390: 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 20         "INTEGER 
a3a0: 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23  PRIMARY KEY");.#
a3b0: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
a3c0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
a3d0: 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61   p = sqlite3Crea
a3e0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
a3f0: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
a400: 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20  onError, 0,.    
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72         0, sortOr
a430: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  der, 0);.    if(
a440: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61   p ){.      p->a
a450: 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  utoIndex = 2;.  
a460: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20    }.    pList = 
a470: 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f  0;.  }..primary_
a480: 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  key_exit:.  sqli
a490: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
a4a0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
a4b0: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ist);.  return;.
a4c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
a4d0: 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ew CHECK constra
a4e0: 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65  int to the table
a4f0: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
a500: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
a510: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
a520: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
a530: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a540: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
a550: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
a560: 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20  pr *pCheckExpr  
a570: 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70  /* The check exp
a580: 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69  ression */.){.#i
a590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a5a0: 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20  T_CHECK.  Table 
a5b0: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
a5c0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
a5d0: 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43   pTab && !IN_DEC
a5e0: 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20  LARE_VTAB ){.   
a5f0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20   pTab->pCheck = 
a600: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
a610: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54  ppend(pParse, pT
a620: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65  ab->pCheck, pChe
a630: 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ckExpr);.    if(
a640: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
a650: 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20  intName.n ){.   
a660: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
a670: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
a680: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
a690: 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61  &pParse->constra
a6a0: 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  intName, 1);.   
a6b0: 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
a6c0: 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
a6d0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
a6e0: 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78  se->db, pCheckEx
a6f0: 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pr);.  }.}../*.*
a700: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
a710: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
a720: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
a730: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
a740: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
a750: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
a760: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
a770: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
a780: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
a790: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61  n *pToken){.  Ta
a7a0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
a7b0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  .  char *zColl; 
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a7d0: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
a7e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
a7f0: 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nce */.  sqlite3
a800: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20   *db;..  if( (p 
a810: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
a820: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
a830: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
a840: 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  1;.  db = pParse
a850: 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20  ->db;.  zColl = 
a860: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
a870: 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
a880: 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29  ;.  if( !zColl )
a890: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
a8a0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
a8b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
a8c0: 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ll) ){.    Index
a8d0: 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69   *pIdx;.    sqli
a8e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
a8f0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b  >aCol[i].zColl);
a900: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
a910: 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  zColl = zColl;. 
a920: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
a930: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
a940: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
a950: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
a960: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a  E <type>",.    *
a970: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
a980: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
a990: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
a9a0: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
a9b0: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
a9c0: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
a9d0: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
a9e0: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
a9f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
aa00: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
aa10: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
aa20: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
aa30: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65  ssert( pIdx->nKe
aa40: 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  yCol==1 );.     
aa50: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
aa60: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20  umn[0]==i ){.   
aa70: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
aa80: 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69  l[0] = p->aCol[i
aa90: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ].zColl;.      }
aaa0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
aab0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
aac0: 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
aad0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
aae0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
aaf0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
ab00: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
ab10: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
ab20: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
ab30: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
ab40: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
ab50: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
ab60: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
ab70: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
ab80: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
ab90: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
aba0: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
abb0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
abc0: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
abd0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
abe0: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
abf0: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
ac00: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
ac10: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
ac20: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
ac30: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
ac40: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
ac50: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
ac60: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
ac70: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
ac80: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
ac90: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
aca0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
acb0: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
acc0: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
acd0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
ace0: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
acf0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
ad00: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
ad10: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
ad20: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
ad30: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   pParse..**.** T
ad40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
ad50: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
ad60: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
ad70: 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  eq().  This rout
ad80: 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74  ine.** invokes t
ad90: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
ada0: 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65  tory if the name
adb0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e  d collation cann
adc0: 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61  ot be found.** a
add0: 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  nd generates an 
ade0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
adf0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
ae00: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
ae10: 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43  q(), sqlite3GetC
ae20: 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c  ollSeq().*/.Coll
ae30: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
ae40: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
ae50: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
ae60: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
ae70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
ae80: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
ae90: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
aea0: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
aeb0: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
aec0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
aed0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
aee0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
aef0: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74  enc, zName, init
af00: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
af10: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
af20: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
af30: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
af40: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
af50: 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c  Seq(pParse, enc,
af60: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a   pColl, zName);.
af70: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
af80: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
af90: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
afa0: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
afb0: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
afc0: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
afd0: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
afe0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
aff0: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
b000: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
b010: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
b020: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
b030: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
b040: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
b050: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
b060: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
b070: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
b080: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
b090: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
b0a0: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
b0b0: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
b0c0: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
b0d0: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
b0e0: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
b0f0: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
b100: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
b110: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
b120: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
b130: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
b140: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
b150: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
b160: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
b170: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
b180: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
b190: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
b1a0: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
b1b0: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
b1c0: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
b1d0: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
b1e0: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
b1f0: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
b200: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
b210: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
b220: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
b230: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
b240: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
b250: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
b260: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
b270: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
b280: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
b290: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
b2a0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b2b0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
b2c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b2d0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
b2e0: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
b2f0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
b300: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
b310: 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  b, 0) );.  sqlit
b320: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b330: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
b340: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
b350: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ->schema_cookie+
b360: 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  1, r1);.  sqlite
b370: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b380: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
b390: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
b3a0: 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73  ERSION, r1);.  s
b3b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
b3c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
b3d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
b3e0: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
b3f0: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
b400: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
b410: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
b420: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
b430: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
b440: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
b450: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
b460: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
b470: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
b480: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
b490: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
b4a0: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
b4b0: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
b4c0: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
b4d0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
b4e0: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
b4f0: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
b500: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
b510: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
b520: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
b530: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
b540: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
b550: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
b560: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
b570: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
b580: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
b590: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
b5a0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
b5b0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
b5c0: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
b5d0: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
b5e0: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
b5f0: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
b600: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
b610: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
b620: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
b630: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
b640: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
b650: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
b660: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
b670: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
b680: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
b690: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
b6a0: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
b6b0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
b6c0: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
b6d0: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
b6e0: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
b6f0: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
b700: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
b710: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
b720: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
b730: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
b740: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
b750: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
b760: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
b770: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
b780: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
b790: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
b7a0: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
b7b0: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
b7c0: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
b7d0: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
b7e0: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
b7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
b800: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
b810: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
b820: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
b830: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
b840: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
b850: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
b860: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
b870: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
b880: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
b890: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
b8a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
b8b0: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
b8c0: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
b8d0: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
b8e0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
b8f0: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
b900: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
b910: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
b920: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
b930: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
b940: 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20  !needQuote ){.  
b950: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49    needQuote = zI
b960: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20  dent[j];.  }..  
b970: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
b980: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
b990: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
b9a0: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
b9b0: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
b9c0: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
b9d0: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
b9e0: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
b9f0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
ba00: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
ba10: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
ba20: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
ba30: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
ba40: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ba50: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
ba60: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
ba70: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
ba80: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
ba90: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
baa0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
bab0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
bac0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
bad0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
bae0: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
baf0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
bb00: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
bb10: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
bb20: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
bb30: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
bb40: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
bb50: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
bb60: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
bb70: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
bb80: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
bb90: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
bba0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
bbb0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
bbc0: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
bbd0: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
bbe0: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
bbf0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
bc00: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
bc10: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
bc20: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
bc30: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
bc40: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
bc50: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
bc60: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
bc70: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
bc80: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
bc90: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
bca0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
bcb0: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
bcc0: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  mt==0 ){.    db-
bcd0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
bce0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
bcf0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
bd00: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
bd10: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
bd20: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
bd30: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
bd40: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
bd50: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
bd60: 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20  );.  zStmt[k++] 
bd70: 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f  = '(';.  for(pCo
bd80: 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  l=p->aCol, i=0; 
bd90: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
bda0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61  pCol++){.    sta
bdb0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
bdc0: 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20   const azType[] 
bdd0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  = {.        /* S
bde0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
bdf0: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
be00: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
be10: 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22  AFF_NONE    */ "
be20: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
be30: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
be40: 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20   */ " NUM",.    
be50: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
be60: 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49  F_INTEGER */ " I
be70: 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  NT",.        /* 
be80: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
be90: 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20     */ " REAL".  
bea0: 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e    };.    int len
beb0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
bec0: 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71   *zType;..    sq
bed0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
bee0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  -k, &zStmt[k], z
bef0: 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73  Sep);.    k += s
bf00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
bf10: 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a  zStmt[k]);.    z
bf20: 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20  Sep = zSep2;.   
bf30: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
bf40: 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65   &k, pCol->zName
bf50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
bf60: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
bf70: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d  LITE_AFF_TEXT >=
bf80: 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
bf90: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
bfa0: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  -SQLITE_AFF_TEXT
bfb0: 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54   < ArraySize(azT
bfc0: 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74  ype) );.    test
bfd0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
bfe0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
bff0: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
c000: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c010: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c020: 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65  F_NONE );.    te
c030: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c040: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c050: 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20  FF_NUMERIC );.  
c060: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
c070: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
c080: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
c090: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c0a0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c0b0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20  SQLITE_AFF_REAL 
c0c0: 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70  );.    .    zTyp
c0d0: 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d  e = azType[pCol-
c0e0: 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49  >affinity - SQLI
c0f0: 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20  TE_AFF_TEXT];.  
c100: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
c110: 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a  trlen30(zType);.
c120: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
c130: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
c140: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20  TE_AFF_NONE .   
c150: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c           || pCol
c160: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69  ->affinity==sqli
c170: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
c180: 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20  zType, 0) );.   
c190: 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b   memcpy(&zStmt[k
c1a0: 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a  ], zType, len);.
c1b0: 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20      k += len;.  
c1c0: 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29    assert( k<=n )
c1d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
c1e0: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
c1f0: 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a  Stmt[k], "%s", z
c200: 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  End);.  return z
c210: 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Stmt;.}../*.** R
c220: 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f  esize an Index o
c230: 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20  bject to hold N 
c240: 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20  columns total.  
c250: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c260: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61  .** on success a
c270: 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  nd SQLITE_NOMEM 
c280: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  on an OOM error.
c290: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
c2a0: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
c2b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
c2c0: 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e  dex *pIdx, int N
c2d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  ){.  char *zExtr
c2e0: 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  a;.  int nByte;.
c2f0: 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
c300: 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20  umn>=N ) return 
c310: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
c320: 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73  ert( pIdx->isRes
c330: 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79  ized==0 );.  nBy
c340: 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61  te = (sizeof(cha
c350: 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36  r*) + sizeof(i16
c360: 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74  ) + 1)*N;.  zExt
c370: 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ra = sqlite3DbMa
c380: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
c390: 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72  te);.  if( zExtr
c3a0: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  a==0 ) return SQ
c3b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
c3c0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
c3d0: 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f  x->azColl, sizeo
c3e0: 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e  f(char*)*pIdx->n
c3f0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
c400: 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
c410: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
c420: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61  ra += sizeof(cha
c430: 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28  r*)*N;.  memcpy(
c440: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69  zExtra, pIdx->ai
c450: 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69  Column, sizeof(i
c460: 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  16)*pIdx->nColum
c470: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f  n);.  pIdx->aiCo
c480: 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78  lumn = (i16*)zEx
c490: 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
c4a0: 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a   sizeof(i16)*N;.
c4b0: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
c4c0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
c4d0: 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  r, pIdx->nColumn
c4e0: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74  );.  pIdx->aSort
c4f0: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78  Order = (u8*)zEx
c500: 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f  tra;.  pIdx->nCo
c510: 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78  lumn = N;.  pIdx
c520: 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b  ->isResized = 1;
c530: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c540: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  _OK;.}../*.** Es
c550: 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c  timate the total
c560: 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61   row width for a
c570: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
c580: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54  c void estimateT
c590: 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20  ableWidth(Table 
c5a0: 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e  *pTab){.  unsign
c5b0: 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  ed wTable = 0;. 
c5c0: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70   const Column *p
c5d0: 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b  TabCol;.  int i;
c5e0: 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e  .  for(i=pTab->n
c5f0: 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  Col, pTabCol=pTa
c600: 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d  b->aCol; i>0; i-
c610: 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20  -, pTabCol++){. 
c620: 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61     wTable += pTa
c630: 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d  bCol->szEst;.  }
c640: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
c650: 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b  ey<0 ) wTable++;
c660: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
c670: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
c680: 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a  t(wTable*4);.}..
c690: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
c6a0: 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65 20  he average size 
c6b0: 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20  of a row for an 
c6c0: 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
c6d0: 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e   void estimateIn
c6e0: 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a  dexWidth(Index *
c6f0: 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pIdx){.  unsigne
c700: 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  d wIndex = 0;.  
c710: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43  int i;.  const C
c720: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49  olumn *aCol = pI
c730: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
c740: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
c750: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
c760: 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20  +){.    i16 x = 
c770: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
c780: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78  ];.    assert( x
c790: 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e  <pIdx->pTable->n
c7a0: 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65  Col );.    wInde
c7b0: 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61  x += x<0 ? 1 : a
c7c0: 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75  Col[pIdx->aiColu
c7d0: 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20  mn[i]].szEst;.  
c7e0: 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52  }.  pIdx->szIdxR
c7f0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
c800: 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a  st(wIndex*4);.}.
c810: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  ./* Return true 
c820: 69 66 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f  if value x is fo
c830: 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66  und any of the f
c840: 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65  irst nCol entrie
c850: 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a  s of aiCol[].*/.
c860: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f  static int hasCo
c870: 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a  lumn(const i16 *
c880: 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c  aiCol, int nCol,
c890: 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65   int x){.  while
c8a0: 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69  ( nCol-- > 0 ) i
c8b0: 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29  f( x==*(aiCol++)
c8c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
c8d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c8e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 70 54 61 62  * The table pTab
c8f0: 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52   has a WITHOUT R
c900: 4f 57 49 44 20 63 6c 61 75 73 65 20 61 74 20 74  OWID clause at t
c910: 68 65 20 65 6e 64 2e 20 20 47 6f 20 74 68 72 6f  he end.  Go thro
c920: 75 67 68 20 61 6e 64 0a 2a 2a 20 6d 61 6b 65 20  ugh and.** make 
c930: 61 6c 6c 20 74 68 65 20 63 68 61 6e 67 65 73 20  all the changes 
c940: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 61 6b  necessary to mak
c950: 65 20 74 68 69 73 20 61 20 57 49 54 48 4f 55 54  e this a WITHOUT
c960: 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 2a 2a   ROWID table..**
c970: 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 43 6f 6e  .**     (1)  Con
c980: 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61  vert the OP_Crea
c990: 74 65 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20  teTable into an 
c9a0: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 20 20 20 20 28 32  no-op..**     (2
c9b0: 29 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  )  Make sure all
c9c0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61   table columns a
c9d0: 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 50  re part of the P
c9e0: 52 49 4d 41 52 59 20 4b 45 59 0a 2a 2a 20 20 20  RIMARY KEY.**   
c9f0: 20 20 28 33 29 20 20 4d 61 6b 65 20 73 75 72 65    (3)  Make sure
ca00: 20 61 6c 6c 20 50 52 49 4d 41 52 59 20 4b 45 59   all PRIMARY KEY
ca10: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72   columns are par
ca20: 74 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 0a  t of all UNIQUE.
ca30: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64 69  **          indi
ca40: 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ces.*/.static vo
ca50: 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68  id convertToWith
ca60: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61  outRowidTable(Pa
ca70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
ca80: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
ca90: 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65  ex *pIdx;.  Inde
caa0: 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50  x *pPk;.  int nP
cab0: 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  k;.  int i, j;. 
cac0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
cad0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
cae0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f   Convert the OP_
caf0: 43 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f  CreateTable opco
cb00: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f  de that would no
cb10: 72 6d 61 6c 6c 79 20 63 72 65 61 74 65 20 74 68  rmally create th
cb20: 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  e.  ** root-page
cb30: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
cb40: 6e 74 6f 20 61 20 4f 50 5f 4e 75 6c 6c 20 6f 70  nto a OP_Null op
cb50: 63 6f 64 65 2e 20 20 54 68 69 73 20 70 72 65 76  code.  This prev
cb60: 65 6e 74 73 20 74 68 65 0a 20 20 2a 2a 20 61 6c  ents the.  ** al
cb70: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
cb80: 72 6f 6f 74 2d 70 61 67 65 20 28 77 68 69 63 68  root-page (which
cb90: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 65   would never bee
cba0: 6e 20 75 73 65 64 2c 20 61 73 20 61 6c 6c 0a 20  n used, as all. 
cbb0: 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 69 73 20 73   ** content is s
cbc0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 69  tored in the pri
cbd0: 6d 61 72 79 2d 6b 65 79 20 69 6e 64 65 78 20 69  mary-key index i
cbe0: 6e 73 74 65 61 64 29 20 61 6e 64 20 69 74 20 63  nstead) and it c
cbf0: 61 75 73 65 73 0a 20 20 2a 2a 20 61 20 4e 55 4c  auses.  ** a NUL
cc00: 4c 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 73  L value in the s
cc10: 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 72 6f 6f  qlite_master.roo
cc20: 74 70 61 67 65 20 66 69 65 6c 64 20 6f 66 20 74  tpage field of t
cc30: 68 65 20 73 63 68 65 6d 61 2e 0a 20 20 2a 2f 0a  he schema..  */.
cc40: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64    if( pParse->ad
cc50: 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 73  drCrTab ){.    s
cc60: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
cc70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
cc80: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
cc90: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e  )->opcode = OP_N
cca0: 75 6c 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  ull;.  }..  /* L
ccb0: 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  ocate the PRIMAR
ccc0: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72  Y KEY index.  Or
ccd0: 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  , if this table 
cce0: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
ccf0: 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50   ** an INTEGER P
cd00: 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65  RIMARY KEY table
cd10: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50  , create a new P
cd20: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
cd30: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  . .  */.  if( pT
cd40: 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
cd50: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
cd60: 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  ist;.    pList =
cd70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
cd80: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
cd90: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  , 0);.    if( pL
cda0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
cdb0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
cdc0: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
cdd0: 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
cde0: 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
ce10: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
ce20: 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
ce30: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
ce40: 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d  tOrder = pParse-
ce50: 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20  >iPkSortOrder;. 
ce60: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
ce70: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54  e->pNewTable==pT
ce80: 61 62 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20  ab );.    pPk = 
ce90: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
cea0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
ceb0: 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d   0, pList, pTab-
cec0: 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20  >keyConf, 0, 0, 
ced0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
cee0: 50 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Pk==0 ) return;.
cef0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
cf00: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
cf10: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
cf20: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
cf30: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pTab);.  }.  ass
cf40: 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20  ert( pPk!=0 );. 
cf50: 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
cf60: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  Col;..  /* Make 
cf70: 73 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  sure every colum
cf80: 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  n of the PRIMARY
cf90: 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c   KEY is NOT NULL
cfa0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
cfb0: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
cfc0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e  pTab->aCol[pPk->
cfd0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74  aiColumn[i]].not
cfe0: 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Null = 1;.  }.  
cff0: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
d000: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 70 64 61   = 1;..  /* Upda
d010: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
d020: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
d030: 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e  of all UNIQUE in
d040: 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74  dices by convert
d050: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e  ing.  ** the fin
d060: 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  al rowid column 
d070: 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  into one or more
d080: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
d090: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a  PRIMARY KEY..  *
d0a0: 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
d0b0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
d0c0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
d0d0: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  t){.    int n;. 
d0e0: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 75 74     if( pIdx->aut
d0f0: 6f 49 6e 64 65 78 3d 3d 32 20 29 20 63 6f 6e 74  oIndex==2 ) cont
d100: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49  inue;.    if( pI
d110: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 70 54 61  dx->nKeyCol==pTa
d120: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
d130: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
d140: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20   pTab->nCol;.   
d150: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
d160: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30   }.    for(i=n=0
d170: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
d180: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
d190: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
d1a0: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
d1b0: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
d1c0: 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  [i]) ) n++;.    
d1d0: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  }.    if( resize
d1e0: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
d1f0: 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  pIdx, pIdx->nKey
d200: 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b  Col+n) ) return;
d210: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
d220: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
d230: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
d240: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
d250: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
d260: 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d   j, pPk->aiColum
d270: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
d280: 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e   assert( j<pPk->
d290: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
d2a0: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
d2b0: 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  n[j] = pPk->aiCo
d2c0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
d2d0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
d2e0: 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69   = pPk->azColl[i
d2f0: 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  ];.        j++;.
d300: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d310: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
d320: 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20  nColumn==j );.  
d330: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
d340: 6e 4b 65 79 43 6f 6c 2b 6e 3d 3d 6a 20 29 3b 0a  nKeyCol+n==j );.
d350: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c    }..  /* Add al
d360: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
d370: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
d380: 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20  EY index.  */.  
d390: 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43  if( nPk<pTab->nC
d3a0: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  ol ){.    if( re
d3b0: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
d3c0: 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e  db, pPk, pTab->n
d3d0: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  Col) ) return;. 
d3e0: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50     for(i=0, j=nP
d3f0: 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  k; i<pTab->nCol;
d400: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
d410: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d   !hasColumn(pPk-
d420: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29  >aiColumn, j, i)
d430: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
d440: 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75  rt( j<pPk->nColu
d450: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  mn );.        pP
d460: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  k->aiColumn[j] =
d470: 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   i;.        pPk-
d480: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49  >azColl[j] = "BI
d490: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6a  NARY";.        j
d4a0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
d4b0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
d4c0: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b  k->nColumn==j );
d4d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
d4e0: 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20  b->nCol==j );.  
d4f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
d500: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d510: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20  d to report the 
d520: 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74  final ")" that t
d530: 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43  erminates.** a C
d540: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
d550: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ement..**.** The
d560: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
d570: 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69   that other acti
d580: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65  on routines have
d590: 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a   been building.*
d5a0: 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  * is added to th
d5b0: 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20  e internal hash 
d5c0: 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67  tables, assuming
d5d0: 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a   no errors have.
d5e0: 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a  ** occurred..**.
d5f0: 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20  ** An entry for 
d600: 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64  the table is mad
d610: 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  e in the master 
d620: 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75  table on disk, u
d630: 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73  nless.** this is
d640: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
d650: 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62  le or db->init.b
d660: 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62  usy==1.  When db
d670: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a  ->init.busy==1.*
d680: 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  * it means we ar
d690: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71  e reading the sq
d6a0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d6b0: 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73  e because we jus
d6c0: 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74  t.** connected t
d6d0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
d6e0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71  r because the sq
d6f0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d700: 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c  e has.** recentl
d710: 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68  y changed, so th
d720: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  e entry for this
d730: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65   table already e
d740: 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20  xists in.** the 
d750: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
d760: 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  ble.  We do not 
d770: 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69  want to create i
d780: 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49  t again..**.** I
d790: 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72  f the pSelect ar
d7a0: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
d7b0: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
d7c0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
d7d0: 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  * was called to 
d7e0: 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67  create a table g
d7f0: 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20  enerated from a 
d800: 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c  .** "CREATE TABL
d810: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20  E ... AS SELECT 
d820: 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20  ..." statement. 
d830: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   The column name
d840: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  s of.** the new 
d850: 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68  table will match
d860: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d870: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  of the SELECT..*
d880: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e  /.void sqlite3En
d890: 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  dTable(.  Parse 
d8a0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d8b0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
d8c0: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
d8d0: 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20  Cons,           
d8e0: 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e  /* The ',' token
d8f0: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
d900: 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a  column defn. */.
d910: 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20    Token *pEnd,  
d920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d930: 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69   ')' before opti
d940: 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54  ons in the CREAT
d950: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20  E TABLE */.  u8 
d960: 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20  tabOpts,        
d970: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61       /* Extra ta
d980: 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75  ble options. Usu
d990: 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c  ally 0. */.  Sel
d9a0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
d9b0: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
d9c0: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
d9d0: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
d9e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20  ){.  Table *p;  
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da00: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
da10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
da20: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
da30: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
da40: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
da50: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
da60: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
da70: 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68  base in which th
da80: 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f  e table lives */
da90: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20  .  Index *pIdx; 
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dab0: 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  An implied index
dac0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
dad0: 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30  ..  if( (pEnd==0
dae0: 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20   && pSelect==0) 
daf0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
db00: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
db10: 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61  n;.  }.  p = pPa
db20: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
db30: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
db40: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
db50: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
db60: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
db70: 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54   if( tabOpts & T
db80: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
db90: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  {.    if( (p->ta
dba0: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
dbb0: 72 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b  rimaryKey)==0 ){
dbc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
dbd0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
dbe0: 6e 6f 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  no PRIMARY KEY f
dbf0: 6f 72 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d  or table %s", p-
dc00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
dc10: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62  se{.      p->tab
dc20: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68  Flags |= TF_With
dc30: 6f 75 74 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  outRowid;.      
dc40: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
dc50: 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73  RowidTable(pPars
dc60: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
dc70: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
dc80: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
dc90: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
dca0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dcb0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
dcc0: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
dcd0: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
dce0: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
dcf0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
dd00: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
dd10: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
dd20: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
dd30: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
dd40: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
dd50: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
dd60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dd70: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
dd80: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
dd90: 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
dda0: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
ddb0: 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
ddc0: 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
ddd0: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
dde0: 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
ddf0: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
de00: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
de10: 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
de20: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
de30: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
de40: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
de50: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
de60: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
de70: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
de80: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
de90: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
dea0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
deb0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
dec0: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
ded0: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
dee0: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
def0: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
df00: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
df10: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
df20: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
df30: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
df40: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
df50: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
df60: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
df70: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
df80: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
df90: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
dfa0: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
dfb0: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
dfc0: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
dfd0: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
dfe0: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
dff0: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
e000: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
e010: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
e020: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
e030: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
e040: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
e050: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
e060: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
e070: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
e080: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
e090: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
e0a0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
e0b0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
e0c0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
e0d0: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
e0e0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
e0f0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
e100: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
e110: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
e120: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
e130: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
e140: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
e150: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
e160: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
e170: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
e180: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
e190: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
e1a0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e1b0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
e1c0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
e1d0: 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n;..    sqlite3V
e1e0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e1f0: 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Close, 0);..    
e200: 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69  /* .    ** Initi
e210: 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20  alize zType for 
e220: 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20  the new view or 
e230: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
e240: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
e250: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
e260: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
e270: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
e280: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
e290: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
e2a0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
e2b0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
e2c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
e2d0: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
e2e0: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
e2f0: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
e300: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
e310: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
e320: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
e330: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
e340: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
e350: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
e360: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
e370: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
e380: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
e390: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
e3a0: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
e3b0: 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74  ble is in regist
e3c0: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
e3d0: 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ot..    **.    *
e3e0: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
e3f0: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
e400: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
e410: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
e420: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
e430: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
e440: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
e450: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
e460: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
e470: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
e480: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
e490: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
e4a0: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
e4b0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
e4c0: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
e4d0: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
e4e0: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
e4f0: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
e500: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
e510: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
e520: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
e530: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
e540: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
e550: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
e560: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
e570: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
e580: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
e590: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
e5a0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
e5b0: 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  st;.      Table 
e5c0: 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20  *pSelTab;..     
e5d0: 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
e5e0: 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
e5f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e600: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
e610: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
e620: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
e630: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e640: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
e650: 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20  _P2ISREG);.     
e660: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
e670: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
e680: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
e690: 64 65 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  dest, SRT_Table,
e6a0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
e6b0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
e6c0: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
e6d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e6e0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e6f0: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Close, 1);.     
e700: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
e710: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
e720: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
e730: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e740: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
e750: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
e760: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
e770: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
e780: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
e790: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   );.        p->n
e7a0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
e7b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Col;.        p->
e7c0: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
e7d0: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
e7e0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
e7f0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
e800: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
e810: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
e820: 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
e830: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
e840: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
e850: 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
e860: 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
e870: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
e880: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
e890: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
e8a0: 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
e8b0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c  (db, p);.    }el
e8c0: 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  se{.      Token 
e8d0: 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73  *pEnd2 = tabOpts
e8e0: 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73   ? &pParse->sLas
e8f0: 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20  tToken : pEnd;. 
e900: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
e910: 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65  End2->z - pParse
e920: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
e930: 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32  .      if( pEnd2
e940: 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20  ->z[0]!=';' ) n 
e950: 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20  += pEnd2->n;.   
e960: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
e970: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
e980: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
e990: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
e9a0: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
e9b0: 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
e9c0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
e9d0: 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
e9e0: 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
e9f0: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
ea00: 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
ea10: 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
ea20: 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
ea30: 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
ea40: 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
ea50: 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
ea60: 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
ea70: 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f  ollected..    */
ea80: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
ea90: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
eaa0: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
eab0: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
eac0: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
ead0: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
eae0: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
eaf0: 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
eb00: 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
eb10: 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
eb20: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
eb30: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
eb40: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
eb50: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
eb60: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
eb70: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
eb80: 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
eb90: 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
eba0: 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
ebb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
ebc0: 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
ebd0: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
ebe0: 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
ebf0: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
ec00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
ec10: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
ec20: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
ec30: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
ec40: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
ec50: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
ec60: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
ec70: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
ec80: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
ec90: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62  /.    if( p->tab
eca0: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
ecb0: 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
ecc0: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
ecd0: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
ece0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ecf0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
ed00: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
ed10: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
ed20: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
ed30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
ed40: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
ed50: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
ed60: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
ed70: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
ed80: 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
ed90: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
eda0: 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
edb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
edc0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
edd0: 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
ede0: 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
edf0: 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
ee00: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
ee10: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
ee20: 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
ee30: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
ee40: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
ee50: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e  tbl_name='%q' AN
ee60: 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  D type!='trigger
ee70: 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  '", p->zName));.
ee80: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
ee90: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
eea0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
eeb0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
eec0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
eed0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
eee0: 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  sy ){.    Table 
eef0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d  *pOld;.    Schem
ef00: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e  a *pSchema = p->
ef10: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73  pSchema;.    ass
ef20: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
ef30: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
ef40: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
ef50: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
ef60: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
ef70: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
ef80: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33    sqlite3Strlen3
efb0: 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a  0(p->zName),p);.
efc0: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
efd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
efe0: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
eff0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
f000: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
f010: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
f020: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
f030: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ed = 1;.      re
f040: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
f050: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
f060: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66  e = 0;.    db->f
f070: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
f080: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
f090: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f0a0: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
f0b0: 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
f0c0: 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
f0d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
f0e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
f0f0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
f100: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
f110: 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
f120: 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
f130: 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
f140: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
f150: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
f160: 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
f170: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
f180: 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74  e = (int)((const
f190: 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a   char *)pCons->z
f1a0: 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20   - zName);.     
f1b0: 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
f1c0: 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
f1d0: 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
f1e0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
f1f0: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
f200: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f210: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
f220: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
f230: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
f240: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
f250: 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
f260: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
f270: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
f280: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
f290: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
f2a0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
f2b0: 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
f2c0: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
f2d0: 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
f2e0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
f2f0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
f300: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
f310: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
f320: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
f330: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
f340: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
f350: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
f360: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
f370: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
f380: 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
f390: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
f3a0: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
f3b0: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
f3c0: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
f3d0: 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
f3e0: 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
f3f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
f400: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
f410: 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
f420: 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
f430: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
f440: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
f450: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
f460: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
f470: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
f480: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
f490: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
f4a0: 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
f4b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
f4c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
f4d0: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
f4e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f4f0: 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
f500: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
f510: 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
f520: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
f530: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
f540: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
f550: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72   }.  sqlite3Star
f560: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
f570: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
f580: 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45  sTemp, 1, 0, noE
f590: 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  rr);.  p = pPars
f5a0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
f5b0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
f5c0: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
f5d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
f5e0: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
f5f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
f600: 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  }.  sqlite3TwoPa
f610: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
f620: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
f630: 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20  pName);.  iDb = 
f640: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
f650: 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
f660: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ema);.  sqlite3F
f670: 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
f680: 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77  arse, iDb, "view
f690: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ", pName);.  if(
f6a0: 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
f6b0: 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
f6c0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f6d0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
f6e0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
f6f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
f700: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
f710: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
f720: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
f730: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
f740: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
f750: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
f760: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
f770: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
f780: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
f790: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
f7a0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
f7b0: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
f7c0: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
f7d0: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
f7e0: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
f7f0: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
f800: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
f810: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
f820: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
f830: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
f840: 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
f850: 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  DUCE);.  sqlite3
f860: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
f870: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28   pSelect);.  if(
f880: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f890: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
f8a0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e  .  }.  if( !db->
f8b0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
f8c0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
f8d0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
f8e0: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
f8f0: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
f900: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
f910: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
f920: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
f930: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
f940: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
f950: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
f960: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 73  ;.  if( ALWAYS(s
f970: 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20  End.z[0]!=0) && 
f980: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
f990: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
f9a0: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
f9b0: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
f9c0: 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
f9d0: 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d  Begin->z);.  z =
f9e0: 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
f9f0: 69 6c 65 28 20 41 4c 57 41 59 53 28 6e 3e 30 29  ile( ALWAYS(n>0)
fa00: 20 26 26 20 73 71 6c 69 74 65 33 49 73 73 70 61   && sqlite3Isspa
fa10: 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d  ce(z[n-1]) ){ n-
fa20: 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
fa30: 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
fa40: 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
fa50: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
fa60: 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
fa70: 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
fa80: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
fa90: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
faa0: 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73  le(pParse, 0, &s
fab0: 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  End, 0, 0);.  re
fac0: 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
fad0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
fae0: 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
faf0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fb00: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
fb10: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
fb20: 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
fb30: 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
fb40: 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
fb50: 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
fb60: 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
fb70: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
fb80: 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
fb90: 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
fba0: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
fbb0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
fbc0: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
fbd0: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
fbe0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
fbf0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
fc00: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
fc10: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
fc20: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
fc30: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
fc40: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
fc50: 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
fc60: 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
fc70: 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
fc80: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
fc90: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
fca0: 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
fcb0: 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
fcc0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
fcd0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
fce0: 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
fcf0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
fd00: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
fd10: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
fd20: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
fd30: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
fd40: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
fd50: 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
fd60: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
fd70: 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
fd80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
fd90: 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
fda0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68  */.  int (*xAuth
fdb0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
fdc0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
fdd0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
fde0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20  const char*);.. 
fdf0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
fe00: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
fe10: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
fe20: 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74  ABLE.  if( sqlit
fe30: 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63  e3VtabCallConnec
fe40: 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
fe50: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
fe60: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
fe70: 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
fe80: 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75  l(pTable) ) retu
fe90: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rn 0;.#endif..#i
fea0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
feb0: 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f  T_VIEW.  /* A po
fec0: 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
fed0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
fee0: 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
fef0: 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
ff00: 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
ff10: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
ff20: 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
ff30: 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
ff40: 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
ff50: 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
ff60: 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
ff70: 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
ff80: 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
ff90: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
ffa0: 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
ffb0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
ffc0: 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
ffd0: 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
ffe0: 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
fff0: 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
10000 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
10010 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
10020 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
10030 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
10040 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
10050 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
10060 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
10070 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
10080 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20  the error above 
10090 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
100a0 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
100b0 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
100c0 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   But the followi
100d0 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c  ng test is still
100e0 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74   important as it
100f0 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20   does come up.  
10100 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
10110 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ing:.  ** .  ** 
10120 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
10130 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20   main.ex1(a);.  
10140 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45  **     CREATE TE
10150 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53  MP VIEW ex1 AS S
10160 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31  ELECT a FROM ex1
10170 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  ;.  **     SELEC
10180 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78  T * FROM temp.ex
10190 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  1;.  */.  if( pT
101a0 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
101b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
101c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
101d0 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
101e0 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
101f0 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
10200 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
10210 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
10220 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
10230 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
10240 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
10250 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
10260 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
10270 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
10280 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
10290 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
102a0 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
102b0 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
102c0 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
102d0 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
102e0 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
102f0 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
10300 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
10310 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
10320 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
10330 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
10340 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
10350 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
10360 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
10370 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
10380 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
10390 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
103a0 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
103b0 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
103c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
103d0 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
103e0 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
103f0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
10400 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  ble->pSelect, 0)
10410 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
10420 20 20 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f      u8 enableLoo
10430 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f  kaside = db->loo
10440 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b  kaside.bEnabled;
10450 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  .    n = pParse-
10460 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74  >nTab;.    sqlit
10470 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
10480 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
10490 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  Sel->pSrc);.    
104a0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
104b0 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
104c0 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
104d0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
104e0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
104f0 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
10500 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
10510 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
10520 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
10530 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
10540 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
10550 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
10560 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
10570 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
10580 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
10590 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
105a0 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
105b0 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
105c0 2e 62 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  .bEnabled = enab
105d0 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20  leLookaside;.   
105e0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
105f0 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  n;.    if( pSelT
10600 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ab ){.      asse
10610 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
10620 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
10630 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
10640 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
10650 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
10660 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
10670 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
10680 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
10690 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
106a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
106b0 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
106c0 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73  elTab);.      as
106d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
106e0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
106f0 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68   0, pTable->pSch
10700 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 70 54  ema) );.      pT
10710 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  able->pSchema->f
10720 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
10730 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c  etViews;.    }el
10740 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  se{.      pTable
10750 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
10760 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a    nErr++;.    }.
10770 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
10780 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
10790 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
107a0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65    nErr++;.  }.#e
107b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
107c0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65  MIT_VIEW */.  re
107d0 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
107e0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
107f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
10800 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
10810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10820 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
10830 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10840 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
10850 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
10860 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
10870 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
10880 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
10890 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
108a0 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
108b0 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
108c0 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61  HashElem *i;.  a
108d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
108e0 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
108f0 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69  , idx, 0) );.  i
10900 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
10910 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
10920 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
10930 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
10940 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
10950 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
10960 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
10970 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
10980 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
10990 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
109a0 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
109b0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
109c0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
109d0 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  eDeleteColumnNam
109e0 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  es(db, pTab);.  
109f0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d      pTab->aCol =
10a00 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   0;.      pTab->
10a10 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nCol = 0;.    }.
10a20 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
10a30 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
10a40 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
10a50 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
10a60 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
10a70 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
10a80 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10a90 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
10aa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
10ab0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
10ac0 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
10ad0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
10ae0 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
10af0 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
10b00 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
10b10 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
10b20 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
10b30 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
10b40 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
10b50 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
10b60 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
10b70 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69  to iTo..**.** Ti
10b80 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65  cket #1728:  The
10b90 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69   symbol table mi
10ba0 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ght still contai
10bb0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  n information.**
10bc0 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f   on tables and/o
10bd0 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61  r indices that a
10be0 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  re the process o
10bf0 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  f being deleted.
10c00 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75  .** If you are u
10c10 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74  nlucky, one of t
10c20 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64  hose deleted ind
10c30 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d  ices or tables m
10c40 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65  ight.** have the
10c50 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e   same rootpage n
10c60 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61  umber as the rea
10c70 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  l table or index
10c80 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e   that is.** bein
10c90 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20  g moved.  So we 
10ca0 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72  cannot stop sear
10cb0 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  ching after the 
10cc0 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20  first match .** 
10cd0 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73  because the firs
10ce0 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65  t match might be
10cf0 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
10d00 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a  deleted indices.
10d10 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  ** or tables and
10d20 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69   not the table/i
10d30 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74  ndex that is act
10d40 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65  ually being move
10d50 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f  d..** We must co
10d60 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75  ntinue looping u
10d70 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ntil all tables 
10d80 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68  and indices with
10d90 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46  .** rootpage==iF
10da0 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f  rom have been co
10db0 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20  nverted to have 
10dc0 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54  a rootpage of iT
10dd0 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  o.** in order to
10de0 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74   be certain that
10df0 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68   we got the righ
10e00 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  t one..*/.#ifnde
10e10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10e20 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
10e30 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
10e40 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ed(sqlite3 *db, 
10e50 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72  int iDb, int iFr
10e60 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
10e70 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
10e80 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
10e90 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
10ea0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
10eb0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
10ec0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44   iDb, 0) );.  pD
10ed0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
10ee0 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44  ];.  pHash = &pD
10ef0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
10f00 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
10f10 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
10f20 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
10f30 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
10f40 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
10f50 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
10f60 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
10f70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
10f80 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
10f90 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
10fa0 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
10fb0 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20  }.  }.  pHash = 
10fc0 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  &pDb->pSchema->i
10fd0 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  dxHash;.  for(pE
10fe0 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
10ff0 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
11000 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
11010 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
11020 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
11030 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
11040 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
11050 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
11060 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
11070 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
11080 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
11090 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
110a0 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
110b0 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
110c0 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
110d0 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
110e0 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
110f0 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
11100 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
11110 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
11120 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
11130 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
11140 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
11150 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
11160 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
11170 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
11180 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
11190 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
111a0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
111b0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
111c0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
111d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
111e0 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
111f0 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
11200 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
11210 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
11220 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
11230 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
11240 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11250 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  Op3(v, OP_Destro
11260 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69  y, iTable, r1, i
11270 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  Db);.  sqlite3Ma
11280 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
11290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
112a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
112b0 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73   /* OP_Destroy s
112c0 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65  tores an in inte
112d0 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20  ger r1. If this 
112e0 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
112f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
11300 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
11310 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
11320 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
11330 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
11340 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
11350 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
11360 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
11370 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
11380 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
11390 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e  **.  ** The "#NN
113a0 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  N" in the SQL is
113b0 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
113c0 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
113d0 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
113e0 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  ** is in registe
113f0 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d  r NNN.  See gram
11400 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69  mar rules associ
11410 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b  ated with the TK
11420 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74  _REGISTER.  ** t
11430 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  oken for additio
11440 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
11450 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
11460 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
11470 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45  e, .     "UPDATE
11480 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70   %Q.%s SET rootp
11490 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64  age=%d WHERE #%d
114a0 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25   AND rootpage=#%
114b0 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  d",.     pParse-
114c0 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
114d0 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
114e0 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20  E(iDb), iTable, 
114f0 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a  r1, r1);.#endif.
11500 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
11510 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
11520 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  r1);.}../*.** Wr
11530 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ite VDBE code to
11540 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61   erase table pTa
11550 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69  b and all associ
11560 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20  ated indices on 
11570 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f  disk..** Code to
11580 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   update the sqli
11590 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
115a0 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
115b0 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73  hema definitions
115c0 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f  .** in case a ro
115d0 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ot-page belongin
115e0 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62  g to another tab
115f0 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
11600 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a  he btree layer.*
11610 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20  * is also added 
11620 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
11630 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
11640 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
11650 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
11660 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73  estroyTable(Pars
11670 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
11680 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20   *pTab){.#ifdef 
11690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
116a0 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a  VACUUM.  Index *
116b0 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20  pIdx;.  int iDb 
116c0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
116d0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
116e0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
116f0 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  );.  destroyRoot
11700 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
11710 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  b->tnum, iDb);. 
11720 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
11730 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
11740 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
11750 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
11760 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64  Page(pParse, pId
11770 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
11780 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66   }.#else.  /* If
11790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
117a0 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d  y be auto-vacuum
117b0 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c   capable (if SQL
117c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
117d0 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  UUM.  ** is not 
117e0 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69  defined), then i
117f0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
11800 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  o call OP_Destro
11810 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61  y on the.  ** ta
11820 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f  ble and index ro
11830 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65  ot-pages in orde
11840 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  r, starting with
11850 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79   the numerically
11860 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72   .  ** largest r
11870 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
11880 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
11890 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
118a0 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a  e root-pages.  *
118b0 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65  * to be destroye
118c0 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62  d is relocated b
118d0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f  y an earlier OP_
118e0 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66  Destroy. i.e. if
118f0 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77   the.  ** follow
11900 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a  ing were coded:.
11910 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73    **.  ** OP_Des
11920 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e  troy 4 0.  ** ..
11930 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  ..  ** OP_Destro
11940 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y 5 0.  **.  ** 
11950 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20  and root page 5 
11960 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74  happened to be t
11970 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
11980 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74  page number in t
11990 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
119a0 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65  , then root page
119b0 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65   5 would be move
119c0 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74  d to page 4 by t
119d0 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73  he .  ** "OP_Des
119e0 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65  troy 4 0" opcode
119f0 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74  . The subsequent
11a00 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30   "OP_Destroy 5 0
11a10 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a  " would hit.  **
11a20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67   a free-list pag
11a30 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  e..  */.  int iT
11a40 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ab = pTab->tnum;
11a50 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65  .  int iDestroye
11a60 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  d = 0;..  while(
11a70 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20   1 ){.    Index 
11a80 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69  *pIdx;.    int i
11a90 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20  Largest = 0;..  
11aa0 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64    if( iDestroyed
11ab0 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73  ==0 || iTab<iDes
11ac0 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20  troyed ){.      
11ad0 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b  iLargest = iTab;
11ae0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
11af0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
11b00 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
11b10 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
11b20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78   int iIdx = pIdx
11b30 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73  ->tnum;.      as
11b40 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68  sert( pIdx->pSch
11b50 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
11b60 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ma );.      if( 
11b70 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
11b80 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
11b90 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
11ba0 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
11bb0 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
11bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11bd0 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
11be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
11bf0 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  urn;.    }else{.
11c00 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
11c10 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
11c20 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
11c30 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
11c40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
11c50 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61  Db>=0 && iDb<pPa
11c60 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  rse->db->nDb );.
11c70 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f        destroyRoo
11c80 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
11c90 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20  argest, iDb);.  
11ca0 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
11cb0 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d   iLargest;.    }
11cc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
11cd0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72  *.** Remove entr
11ce0 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ies from the sql
11cf0 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73  ite_statN tables
11d00 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c   (for N in (1,2,
11d10 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44  3)).** after a D
11d20 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f  ROP INDEX or DRO
11d30 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e  P TABLE command.
11d40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11d50 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
11d60 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20  Tables(.  Parse 
11d70 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11d80 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
11d90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
11da0 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20   iDb,           
11db0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
11dc0 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
11dd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
11de0 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20  e,     /* "idx" 
11df0 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f  or "tbl" */.  co
11e00 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
11e10 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11e20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a  index or table *
11e30 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
11e40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
11e50 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ame = pParse->db
11e60 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
11e70 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
11e80 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  4; i++){.    cha
11e90 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20  r zTab[24];.    
11ea0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
11eb0 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54  (sizeof(zTab),zT
11ec0 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25  ab,"sqlite_stat%
11ed0 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73  d",i);.    if( s
11ee0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
11ef0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62  pParse->db, zTab
11f00 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20  , zDbName) ){.  
11f10 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
11f20 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
11f30 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
11f40 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
11f50 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  %s=%Q",.        
11f60 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a  zDbName, zTab, z
11f70 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Type, zName.    
11f80 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
11f90 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11fa0 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20   code to drop a 
11fb0 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
11fc0 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
11fd0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
11fe0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
11ff0 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56  int iDb, int isV
12000 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iew){.  Vdbe *v;
12010 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12020 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54   pParse->db;.  T
12030 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
12040 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64  ;.  Db *pDb = &d
12050 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
12060 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
12070 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
12080 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
12090 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
120a0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
120b0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
120c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
120d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
120e0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
120f0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
12100 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
12110 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a  OP_VBegin);.  }.
12120 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
12130 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
12140 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
12150 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
12160 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a  ropped. Code.  *
12170 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
12180 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
12190 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
121a0 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20  ter and/or.  ** 
121b0 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
121c0 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
121d0 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20    */.  pTrigger 
121e0 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
121f0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  List(pParse, pTa
12200 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72  b);.  while( pTr
12210 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73  igger ){.    ass
12220 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
12230 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
12240 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
12250 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
12260 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
12270 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73  pSchema );.    s
12280 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
12290 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
122a0 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69  igger);.    pTri
122b0 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
122c0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66  >pNext;.  }..#if
122d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
122e0 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
122f0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
12300 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
12310 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
12320 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
12330 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62  ith.  ** the tab
12340 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
12350 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
12360 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
12370 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20  is dropped.  ** 
12380 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76  at the btree lev
12390 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  el, in case the 
123a0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
123b0 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20  table needs to. 
123c0 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
123d0 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
123e0 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
123f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
12400 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  )..  */.  if( pT
12410 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
12420 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
12430 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  ){.    sqlite3Ne
12440 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
12450 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  ,.      "DELETE 
12460 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
12470 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61  equence WHERE na
12480 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44  me=%Q",.      pD
12490 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
124a0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
124b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72  .#endif..  /* Dr
124c0 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
124d0 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
124e0 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
124f0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
12500 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
12510 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
12520 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
12530 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
12540 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72  eletes.  ** ever
12550 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
12560 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
12570 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
12580 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
12590 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
125a0 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
125b0 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63  d separately bec
125c0 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
125d0 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  an be.  ** creat
125e0 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
125f0 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
12600 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
12610 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64  n another.  ** d
12620 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
12630 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
12640 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
12650 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
12660 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
12670 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
12680 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
12690 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53     pDb->zName, S
126a0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
126b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
126c0 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
126d0 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
126e0 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  ) ){.    destroy
126f0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
12700 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ab);.  }..  /* R
12710 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
12720 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
12730 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
12740 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20  ema and modify. 
12750 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63   ** the schema c
12760 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  ookie..  */.  if
12770 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
12780 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
12790 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
127a0 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20  _VDestroy, iDb, 
127b0 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
127c0 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e, 0);.  }.  sql
127d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
127e0 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
127f0 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
12800 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  >zName, 0);.  sq
12810 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
12820 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
12830 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
12840 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d  tAll(db, iDb);.}
12850 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12860 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
12870 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
12880 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
12890 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
128a0 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
128b0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
128c0 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
128d0 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
128e0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
128f0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
12900 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
12910 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
12920 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
12930 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
12940 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
12950 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
12960 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
12970 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
12980 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
12990 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
129a0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
129b0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
129c0 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
129d0 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
129e0 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20  uppressErr++;.  
129f0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
12a00 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
12a10 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70  arse, isView, &p
12a20 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69  Name->a[0]);.  i
12a30 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
12a40 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
12a50 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
12a60 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
12a70 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
12a80 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
12a90 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
12aa0 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
12ab0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
12ac0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
12ad0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
12ae0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
12af0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
12b00 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
12b10 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
12b20 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
12b30 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
12b40 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
12b50 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
12b60 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
12b70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
12b80 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
12b90 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
12ba0 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
12bb0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
12bc0 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
12bd0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
12be0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
12bf0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
12c00 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
12c10 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
12c20 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
12c30 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
12c40 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
12c50 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
12c60 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
12c70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
12c80 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
12c90 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
12ca0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
12cb0 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
12cc0 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
12cd0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
12ce0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
12cf0 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
12d00 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
12d10 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
12d20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
12d30 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
12d40 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
12d50 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
12d60 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
12d70 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
12d80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12d90 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
12da0 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
12db0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
12dc0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
12dd0 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
12de0 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69      zArg2 = sqli
12df0 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
12e00 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e   pTab)->pMod->zN
12e10 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
12e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
12e30 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
12e40 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
12e50 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
12e60 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
12e70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12e80 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
12e90 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
12ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12eb0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
12ec0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
12ed0 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
12ee0 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
12ef0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
12f00 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
12f10 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
12f20 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
12f30 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
12f40 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
12f50 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
12f60 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
12f70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
12f80 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
12f90 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
12fa0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
12fb0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
12fc0 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
12fd0 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
12fe0 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c  , "sqlite_stat",
12ff0 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73   11)!=0 ){.    s
13000 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13010 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
13020 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
13030 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
13040 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
13050 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
13060 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13070 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
13080 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
13090 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
130a0 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
130b0 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
130c0 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
130d0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
130e0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
130f0 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
13100 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13110 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
13120 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
13130 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
13140 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
13150 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
13160 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
13170 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
13180 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
13190 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
131a0 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
131b0 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
131c0 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
131d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
131e0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
131f0 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
13200 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13210 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
13220 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
13230 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
13240 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
13250 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
13260 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
13270 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
13280 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
13290 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
132a0 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
132b0 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
132c0 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
132d0 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e   "tbl", pTab->zN
132e0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
132f0 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61  3FkDropTable(pPa
13300 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62  rse, pName, pTab
13310 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
13320 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  deDropTable(pPar
13330 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69  se, pTab, iDb, i
13340 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69  sView);.  }..exi
13350 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
13360 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
13370 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
13380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
13390 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
133a0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
133b0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
133c0 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
133d0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
133e0 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
133f0 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
13400 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
13410 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
13420 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
13430 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
13440 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
13450 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
13460 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
13470 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
13480 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
13490 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
134a0 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
134b0 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  o.  pToCol is a 
134c0 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69  list of tables i
134d0 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70  n the other.** p
134e0 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20 74 68  To table that th
134f0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f  e foreign key po
13500 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20  ints to.  flags 
13510 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20  contains all.** 
13520 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
13530 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72  t the conflict r
13540 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
13550 74 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a  thms specified.*
13560 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45  * in the ON DELE
13570 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e  TE, ON UPDATE an
13580 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75  d ON INSERT clau
13590 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b  ses..**.** An FK
135a0 65 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ey structure is 
135b0 63 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65  created and adde
135c0 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  d to the table c
135d0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65  urrently.** unde
135e0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
135f0 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e  n the pParse->pN
13600 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a  ewTable field..*
13610 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e  *.** The foreign
13620 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20   key is set for 
13630 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73  IMMEDIATE proces
13640 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75  sing.  A subsequ
13650 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73  ent call.** to s
13660 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
13670 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68  gnKey() might ch
13680 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46  ange this to DEF
13690 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ERRED..*/.void s
136a0 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
136b0 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20  ignKey(.  Parse 
136c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
136d0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
136e0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
136f0 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43  *pFromCol,  /* C
13700 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74  olumns in this t
13710 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20  able that point 
13720 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  to other table *
13730 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20  /.  Token *pTo, 
13740 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
13750 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61   of the other ta
13760 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
13770 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a  t *pToCol,    /*
13780 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   Columns in the 
13790 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
137a0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
137b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
137c0 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
137d0 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20  orithms. */.){. 
137e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
137f0 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
13800 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
13810 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65  OREIGN_KEY.  FKe
13820 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20  y *pFKey = 0;.  
13830 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20  FKey *pNextTo;. 
13840 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
13850 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
13860 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
13870 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
13880 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
13890 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
138a0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49  .  if( p==0 || I
138b0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
138c0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
138d0 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
138e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
138f0 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
13900 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c   if( NEVER(iCol<
13910 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  0) ) goto fk_end
13920 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c  ;.    if( pToCol
13930 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
13940 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  r!=1 ){.      sq
13950 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13960 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b  arse, "foreign k
13970 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20  ey on %s".      
13980 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65     " should refe
13990 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63  rence only one c
139a0 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25  olumn of table %
139b0 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e  T",.         p->
139c0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
139d0 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f  , pTo);.      go
139e0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d  to fk_end;.    }
139f0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20  .    nCol = 1;. 
13a00 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f   }else if( pToCo
13a10 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78  l && pToCol->nEx
13a20 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  pr!=pFromCol->nE
13a30 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
13a40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13a50 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62  e,.        "numb
13a60 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
13a70 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65   foreign key doe
13a80 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
13a90 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20  number of ".    
13aa0 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20      "columns in 
13ab0 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
13ac0 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f  able");.    goto
13ad0 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65   fk_end;.  }else
13ae0 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72  {.    nCol = pFr
13af0 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20  omCol->nExpr;.  
13b00 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  }.  nByte = size
13b10 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43  of(*pFKey) + (nC
13b20 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b  ol-1)*sizeof(pFK
13b30 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70  ey->aCol[0]) + p
13b40 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28  To->n + 1;.  if(
13b50 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
13b60 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c  or(i=0; i<pToCol
13b70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13b80 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71       nByte += sq
13b90 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
13ba0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
13bb0 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) + 1;.    }.  }
13bc0 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74  .  pFKey = sqlit
13bd0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
13be0 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  b, nByte );.  if
13bf0 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  ( pFKey==0 ){.  
13c00 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
13c10 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f   }.  pFKey->pFro
13c20 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e  m = p;.  pFKey->
13c30 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70  pNextFrom = p->p
13c40 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61  FKey;.  z = (cha
13c50 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  r*)&pFKey->aCol[
13c60 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e  nCol];.  pFKey->
13c70 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
13c80 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
13c90 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
13ca0 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
13cb0 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20  Dequote(z);.  z 
13cc0 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
13cd0 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f  FKey->nCol = nCo
13ce0 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  l;.  if( pFromCo
13cf0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65  l==0 ){.    pFKe
13d00 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d  y->aCol[0].iFrom
13d10 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
13d20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
13d30 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
13d40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  {.      int j;. 
13d50 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
13d60 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  p->nCol; j++){. 
13d70 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
13d80 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f  e3StrICmp(p->aCo
13d90 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f  l[j].zName, pFro
13da0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
13db0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13dc0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
13dd0 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20  .iFrom = j;.    
13de0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13e00 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e       if( j>=p->n
13e10 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Col ){.        s
13e20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13e30 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
13e40 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d    "unknown colum
13e50 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65  n \"%s\" in fore
13e60 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
13e70 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  on", .          
13e80 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
13e90 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
13ea0 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20  oto fk_end;.    
13eb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13ec0 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
13ed0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
13ee0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
13ef0 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
13f00 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
13f10 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
13f20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d    pFKey->aCol[i]
13f30 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20  .zCol = z;.     
13f40 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
13f50 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
13f60 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
13f70 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
13f80 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
13f90 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
13fa0 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
13fb0 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
13fc0 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
13fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
13fe0 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
13ff0 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
14000 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
14010 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
14020 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
14030 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
14040 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14050 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
14060 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
14070 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
14080 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
14090 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
140a0 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
140b0 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
140c0 3e 7a 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72  >zTo, sqlite3Str
140d0 6c 65 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f  len30(pFKey->zTo
140e0 29 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79  ), (void *)pFKey
140f0 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78  .  );.  if( pNex
14100 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20  tTo==pFKey ){.  
14110 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
14120 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ed = 1;.    goto
14130 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
14140 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
14150 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
14160 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
14170 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
14180 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
14190 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
141a0 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
141b0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
141c0 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
141d0 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
141e0 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
141f0 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
14200 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
14210 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
14220 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
14230 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
14240 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14250 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
14260 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
14270 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
14280 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
14290 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
142a0 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
142b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
142c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
142d0 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
142e0 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
142f0 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
14300 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
14310 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
14320 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
14330 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
14340 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
14350 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
14360 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
14370 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
14380 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
14390 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
143a0 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
143b0 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
143c0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
143d0 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
143e0 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
143f0 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
14400 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
14410 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
14420 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
14430 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
14440 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
14450 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
14460 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
14470 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
14480 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
14490 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
144a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
144b0 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
144c0 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
144d0 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
144e0 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
144f0 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
14500 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
14510 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
14520 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
14530 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
14540 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
14550 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
14560 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
14570 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
14580 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
14590 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
145a0 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
145b0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
145c0 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
145d0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
145e0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
145f0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
14600 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
14610 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
14620 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
14630 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
14640 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
14650 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
14660 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
14670 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
14680 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
14690 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
146a0 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
146b0 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
146c0 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
146d0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
146e0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
146f0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
14700 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
14710 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
14720 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
14730 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
14740 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
14750 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
14760 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
14770 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
14780 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
14790 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
147a0 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
147b0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
147c0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
147d0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
147e0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
147f0 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
14800 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
14810 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
14820 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
14830 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
14840 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
14850 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
14880 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
14890 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
148a0 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
148c0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
148d0 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
148e0 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14900 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
14910 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
14920 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
14930 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
14940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
14950 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
14960 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
14970 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  xLabel;         
14980 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74      /* Jump to t
14990 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69  his label to ski
149a0 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62  p a row */.  Vdb
149b0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
149c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
149d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
149e0 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
149f0 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
14a00 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
14a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
14a20 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
14a30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
14a40 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
14a50 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
14a60 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69  holding assembli
14a70 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  ed index record 
14a80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14a90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
14aa0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
14ab0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
14ac0 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  /.  int iDb = sq
14ad0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
14ae0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
14af0 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
14b00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14b10 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
14b20 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
14b30 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
14b40 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65  E_REINDEX, pInde
14b50 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20  x->zName, 0,.   
14b60 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
14b70 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72  zName ) ){.    r
14b80 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
14b90 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20  f..  /* Require 
14ba0 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
14bb0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72  the table to per
14bc0 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74  form this operat
14bd0 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
14be0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
14bf0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
14c00 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 1, pTab->zNam
14c10 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  e);..  v = sqlit
14c20 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14c30 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
14c40 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65  return;.  if( me
14c50 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a  mRootPage>=0 ){.
14c60 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f      tnum = memRo
14c70 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  otPage;.  }else{
14c80 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64  .    tnum = pInd
14c90 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20  ex->tnum;.  }.  
14ca0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
14cb0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
14cc0 65 2c 20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f  e, pIndex);..  /
14cd0 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65  * Open the sorte
14ce0 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61  r cursor if we a
14cf0 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a  re to use one. *
14d00 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50  /.  iSorter = pP
14d10 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
14d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14d30 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70  4(v, OP_SorterOp
14d40 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20  en, iSorter, 0, 
14d50 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20  0, (char*)pKey, 
14d60 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
14d70 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c  /* Open the tabl
14d80 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  e. Loop through 
14d90 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
14da0 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67  table, inserting
14db0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f   index.  ** reco
14dc0 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  rds into the sor
14dd0 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ter. */.  sqlite
14de0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
14df0 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
14e00 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
14e10 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
14e20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14e30 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
14e40 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  , 0);.  regRecor
14e50 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
14e60 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a  mpReg(pParse);..
14e70 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
14e80 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
14e90 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20  , pIndex, iTab, 
14ea0 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20 26 69  regRecord, 0, &i
14eb0 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20  PartIdxLabel);. 
14ec0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ed0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
14ee0 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
14ef0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
14f00 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
14f10 4c 61 62 65 6c 28 76 2c 20 69 50 61 72 74 49 64  Label(v, iPartId
14f20 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  xLabel);.  sqlit
14f30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14f40 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
14f50 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
14f60 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
14f70 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20  , addr1);.  if( 
14f80 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20  memRootPage<0 ) 
14f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14fa0 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  2(v, OP_Clear, t
14fb0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  num, iDb);.  sql
14fc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14fd0 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
14fe0 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c  iIdx, tnum, iDb,
14ff0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15000 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
15010 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
15020 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74  ANDOFF);.  sqlit
15030 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
15040 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52  , OPFLAG_BULKCSR
15050 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  |((memRootPage>=
15060 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45  0)?OPFLAG_P2ISRE
15070 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20  G:0));..  addr1 
15080 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15090 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
150a0 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30  Sort, iSorter, 0
150b0 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  );.  if( pIndex-
150c0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
150d0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20  e ){.    int j2 
150e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
150f0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b  rentAddr(v) + 3;
15100 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15110 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
15120 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20 61  o, 0, j2);.    a
15130 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
15140 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15150 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15160 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
15170 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f  rterCompare, iSo
15180 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63  rter, j2, regRec
15190 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ord);.    sqlite
151a0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
151b0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
151c0 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
151d0 2c 0a 20 20 20 20 20 20 20 20 4f 45 5f 41 62 6f  ,.        OE_Abo
151e0 72 74 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  rt, "indexed col
151f0 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
15200 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 0a  que", P4_STATIC.
15210 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
15220 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
15230 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15240 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr(v);.  }.  sql
15250 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15260 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
15270 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
15280 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
15290 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
152a0 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
152b0 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
152c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
152d0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
152e0 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
152f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15300 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
15310 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
15320 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15330 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
15340 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32  , iSorter, addr2
15350 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15360 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
15370 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
15380 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
15390 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
153a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
153b0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
153c0 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
153d0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
153e0 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
153f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
15400 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
15410 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
15420 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
15430 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
15440 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
15450 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
15460 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
15470 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
15480 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
15490 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
154a0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
154b0 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
154c0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
154d0 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
154e0 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
154f0 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
15500 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
15510 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
15520 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
15530 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
15540 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
15550 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
15560 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
15570 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
15580 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
15590 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
155a0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
155b0 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
155c0 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
155d0 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
155e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
155f0 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
15600 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
15610 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
15620 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
15630 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
15640 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
15650 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
15660 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
15670 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
15680 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
15690 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
156a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
156b0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
156c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
156d0 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
156e0 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
156f0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
15700 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
15710 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
15720 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b  (tRowcnt)*(nCol+
15730 31 29 20 2b 20 20 20 20 2f 2a 20 49 6e 64 65 78  1) +    /* Index
15740 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20  .aiRowEst   */. 
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15760 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
15770 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
15780 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
15790 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
157a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
157b0 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
157c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
157d0 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
157e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
157f0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
15800 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
15810 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
15820 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
15830 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
15840 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
15850 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
15860 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 70  *)pExtra;      p
15870 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
15880 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
15890 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
158a0 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e 74 2a  wEst = (tRowcnt*
158b0 29 70 45 78 74 72 61 3b 20 20 70 45 78 74 72 61  )pExtra;  pExtra
158c0 20 2b 3d 20 73 69 7a 65 6f 66 28 74 52 6f 77 63   += sizeof(tRowc
158d0 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  nt)*(nCol+1);.  
158e0 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
158f0 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
15900 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a     pExtra += siz
15910 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20  eof(i16)*nCol;. 
15920 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
15930 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a   = (u8*)pExtra;.
15940 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d      p->nColumn =
15950 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b   nCol;.    p->nK
15960 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31  eyCol = nCol - 1
15970 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d  ;.    *ppExtra =
15980 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42   ((char*)p) + nB
15990 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
159a0 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n p;.}../*.** Cr
159b0 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
159c0 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
159d0 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
159e0 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
159f0 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
15a00 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
15a10 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
15a20 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
15a30 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
15a40 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
15a50 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
15a60 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
15a70 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
15a80 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
15a90 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
15aa0 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
15ab0 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
15ac0 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
15ad0 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
15ae0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
15af0 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
15b00 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
15b10 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
15b20 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
15b30 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
15b40 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
15b50 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
15b60 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
15b70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
15b80 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
15b90 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
15ba0 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
15bb0 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
15bc0 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
15bd0 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
15be0 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
15bf0 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
15c00 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
15c10 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
15c20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64  **.** If the ind
15c30 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75  ex is created su
15c40 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75  ccessfully, retu
15c50 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
15c60 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a  the new Index.**
15c70 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73   structure. This
15c80 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
15c90 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
15ca0 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69  () to mark the i
15cb0 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74  ndex.** as the t
15cc0 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
15cd0 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49 6e 64  y (Index.autoInd
15ce0 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78  ex==2)..*/.Index
15cf0 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49   *sqlite3CreateI
15d00 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
15d10 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c  Parse,     /* Al
15d20 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
15d30 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
15d40 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
15d50 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  1,     /* First 
15d60 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
15d70 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
15d80 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
15d90 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  e2,     /* Secon
15da0 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
15db0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
15dc0 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
15dd0 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62  pTblName, /* Tab
15de0 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
15df0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
15e00 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
15e10 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
15e20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
15e30 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
15e40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
15e50 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45  ror,       /* OE
15e60 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
15e70 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
15e80 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
15e90 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
15ea0 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
15eb0 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
15ec0 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  s this statement
15ed0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57   */.  Expr *pPIW
15ee0 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52  here,    /* WHER
15ef0 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72  E clause for par
15f00 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a  tial indices */.
15f10 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
15f20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
15f30 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
15f40 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
15f50 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
15f60 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d  tExist     /* Om
15f70 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
15f80 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
15f90 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
15fa0 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pRet = 0;     /*
15fb0 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75   Pointer to retu
15fc0 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rn */.  Table *p
15fd0 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
15fe0 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
15ff0 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
16000 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
16010 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
16020 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
16030 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
16040 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
16050 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
16060 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
16070 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
16080 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
16090 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
160a0 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
160b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
160c0 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
160d0 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
160e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
160f0 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
16100 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
16110 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
16120 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
16130 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
16140 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
16150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16160 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
16170 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
16180 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
16190 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
161a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
161b0 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
161c0 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
161d0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
161e0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
161f0 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
16200 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
16210 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
16220 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
16230 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
16240 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
16250 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
16260 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t */.  const Col
16270 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 20 20 20  umn *pTabCol;   
16280 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c          /* A col
16290 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
162a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
162b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
162c0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
162d0 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45  allocated for zE
162e0 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  xtra[] */.  int 
162f0 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20  nExtraCol;      
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16310 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
16320 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a  columns needed *
16330 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  /.  char *zExtra
16340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16350 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70       /* Extra sp
16360 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
16370 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
16380 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20  Index *pPk = 0; 
16390 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20       /* PRIMARY 
163a0 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49  KEY index for WI
163b0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
163c0 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
163d0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
163e0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76 65   );      /* Neve
163f0 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
16400 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
16410 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
16420 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  iled || IN_DECLA
16430 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
16440 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
16450 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
16460 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
16470 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
16480 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
16490 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
164a0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
164b0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
164c0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
164d0 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
164e0 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
164f0 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
16500 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
16510 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
16520 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
16530 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
16540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
16550 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
16560 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
16570 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
16580 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
16590 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
165a0 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
165b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
165c0 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
165d0 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
165e0 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
165f0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
16600 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
16610 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
16620 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
16630 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
16640 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
16650 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b  e && pName->z );
16660 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16670 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
16680 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
16690 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
166a0 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
166b0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
166c0 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
166d0 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
166e0 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
166f0 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
16700 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
16710 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
16720 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
16730 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
16740 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
16750 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
16760 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
16770 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
16780 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d       if( pName2-
16790 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
167a0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
167b0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
167c0 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44  ma ){.        iD
167d0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 1;.      }. 
167e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
167f0 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
16800 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
16810 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
16820 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  me);.    if( sql
16830 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
16840 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20  sFix, pTblName) 
16850 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
16860 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
16870 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
16880 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
16890 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
168a0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
168b0 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
168c0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
168d0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
168e0 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
168f0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
16900 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26  tem(pParse, 0, &
16910 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  pTblName->a[0]);
16920 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
16930 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
16940 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20   || pTab==0 );. 
16950 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
16960 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
16970 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
16980 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61   iDb==1 && db->a
16990 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21  Db[iDb].pSchema!
169a0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
169b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
169c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
169d0 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e  .           "can
169e0 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d  not create a TEM
169f0 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54  P index on non-T
16a00 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22  EMP table \"%s\"
16a10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
16a20 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
16a30 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
16a40 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
16a50 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
16a60 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20  d(pTab) ) pPk = 
16a70 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
16a80 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
16a90 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
16aa0 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
16ab0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
16ac0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  t==0 );.    pTab
16ad0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
16ae0 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
16af0 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
16b00 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
16b10 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
16b20 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
16b30 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
16b40 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
16b50 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61  ->aDb[iDb];..  a
16b60 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
16b70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
16b80 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
16b90 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
16ba0 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
16bb0 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
16bc0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  =0 .       && sq
16bd0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70  lite3StrNICmp(&p
16be0 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61  Tab->zName[7],"a
16bf0 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20  ltertab_",9)!=0 
16c00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
16c10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16c20 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
16c30 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
16c40 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
16c50 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
16c60 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
16c70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16c80 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
16c90 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
16ca0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16cb0 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
16cc0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
16cd0 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
16ce0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
16cf0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
16d00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16d10 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
16d20 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
16d30 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
16d40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16d50 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
16d60 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
16d70 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
16d80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
16d90 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
16da0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
16db0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
16dc0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
16dd0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
16de0 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
16df0 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
16e00 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
16e10 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
16e20 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
16e30 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
16e40 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
16e50 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
16e60 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
16e70 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
16e80 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
16e90 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
16ea0 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
16eb0 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
16ec0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
16ed0 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
16ee0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
16ef0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
16f00 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
16f10 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
16f20 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
16f30 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
16f40 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
16f50 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
16f60 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
16f70 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
16f80 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
16f90 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
16fa0 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
16fb0 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
16fc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
16fd0 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
16fe0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
16ff0 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
17000 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
17010 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
17020 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
17030 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
17040 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
17050 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
17060 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
17070 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
17080 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
17090 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
170a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
170b0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
170c0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
170d0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
170e0 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
170f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17100 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17110 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
17120 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
17130 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
17140 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
17150 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17170 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
17180 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
17190 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
171a0 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
171b0 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
171c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
171d0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
171e0 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
171f0 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
17200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17210 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
17220 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
17230 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
17240 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
17250 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
17260 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  }.      goto exi
17270 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17280 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
17290 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
172a0 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
172b0 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
172c0 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
172d0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
172e0 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
172f0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
17300 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
17310 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
17320 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
17330 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
17340 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
17350 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17360 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17370 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
17380 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
17390 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
173a0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
173b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
173c0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
173d0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
173e0 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
173f0 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
17400 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17410 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
17420 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
17430 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
17440 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
17450 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17460 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
17470 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
17480 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
17490 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
174a0 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
174b0 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
174c0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
174d0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
174e0 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
174f0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
17500 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
17510 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17520 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
17530 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
17540 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
17550 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
17560 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
17570 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
17580 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
17590 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
175a0 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
175b0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
175c0 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
175d0 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
175e0 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
175f0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
17600 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
17610 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
17620 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
17630 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
17640 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
17650 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17660 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e    pList->a[0].zN
17670 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
17680 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
17690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176b0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
176c0 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
176d0 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  1].zName);.    p
176e0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
176f0 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f  rder = (u8)sortO
17700 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
17710 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
17720 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
17730 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
17740 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
17750 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
17760 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
17770 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
17780 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
17790 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
177a0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
177b0 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
177c0 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
177d0 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
177e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
177f0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  ==TK_COLLATE );.
17800 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
17810 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
17820 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
17830 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  oken));.    }.  
17840 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
17850 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
17860 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
17870 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
17880 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
17890 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20  e);.  nExtraCol 
178a0 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65  = pPk ? pPk->nKe
178b0 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64  yCol : 1;.  pInd
178c0 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  ex = sqlite3Allo
178d0 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
178e0 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  db, pList->nExpr
178f0 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20   + nExtraCol,.  
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74      nName + nExt
17930 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29  ra + 1, &zExtra)
17940 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
17950 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
17960 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17970 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
17980 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
17990 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
179a0 78 2d 3e 61 69 52 6f 77 45 73 74 29 20 29 3b 0a  x->aiRowEst) );.
179b0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
179c0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
179d0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29  Index->azColl) )
179e0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
179f0 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45  e = zExtra;.  zE
17a00 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20  xtra += nName + 
17a10 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  1;.  memcpy(pInd
17a20 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
17a30 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
17a40 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
17a50 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  Tab;.  pIndex->o
17a60 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
17a70 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
17a80 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  uniqNotNull = on
17a90 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a  Error!=OE_None;.
17aa0 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e    pIndex->autoIn
17ab0 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61 6d 65  dex = (u8)(pName
17ac0 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ==0);.  pIndex->
17ad0 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
17ae0 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
17af0 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
17b00 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
17b10 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65  ;.  if( pPIWhere
17b20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
17b30 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
17b40 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
17b50 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50  , NC_PartIdx, pP
17b60 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  IWhere, 0);.    
17b70 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78  pIndex->pPartIdx
17b80 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65  Where = pPIWhere
17b90 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d  ;.    pPIWhere =
17ba0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
17bb0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
17bc0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
17bd0 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  , 0) );..  /* Ch
17be0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
17bf0 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
17c00 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
17c10 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
17c20 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
17c30 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
17c40 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
17c50 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
17c60 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
17c70 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
17c80 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
17c90 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
17ca0 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
17cb0 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
17cc0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
17cd0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
17ce0 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
17cf0 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
17d00 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
17d10 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
17d20 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
17d30 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
17d40 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
17d50 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a   found..  **.  *
17d60 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74  * TODO:  Add a t
17d70 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  est to make sure
17d80 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
17d90 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d  olumn is not nam
17da0 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61  ed.  ** more tha
17db0 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68  n once within th
17dc0 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f  e same index.  O
17dd0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e  nly the first in
17de0 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74  stance of.  ** t
17df0 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65  he column will e
17e00 76 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74  ver be used by t
17e10 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e  he optimizer.  N
17e20 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74  ote that using t
17e30 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c  he.  ** same col
17e40 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  umn more than on
17e50 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ce cannot be an 
17e60 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68  error because th
17e70 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62  at would .  ** b
17e80 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63  reak backwards c
17e90 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69  ompatibility - i
17ea0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20  t needs to be a 
17eb0 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  warning..  */.  
17ec0 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
17ed0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
17ee0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
17ef0 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
17f00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17f10 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
17f20 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
17f30 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
17f40 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61  rtOrder;.    cha
17f50 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
17f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17f70 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
17f80 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66  e name */..    f
17f90 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d  or(j=0, pTabCol=
17fa0 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
17fb0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
17fc0 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  TabCol++){.     
17fd0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
17fe0 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54  Cmp(zColName, pT
17ff0 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  abCol->zName)==0
18000 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
18010 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
18020 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
18030 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18040 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
18050 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
18060 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
18070 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a    pTab->zName, z
18080 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
18090 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
180a0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  ema = 1;.      g
180b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
180c0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
180d0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
180e0 43 6f 6c 3c 3d 30 78 37 66 66 66 20 26 26 20 6a  Col<=0x7fff && j
180f0 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20  <=0x7fff );.    
18100 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
18110 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20  [i] = (i16)j;.  
18120 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
18130 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >pExpr ){.      
18140 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20  int nColl;.     
18150 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 49 74   assert( pListIt
18160 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  em->pExpr->op==T
18170 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20  K_COLLATE );.   
18180 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74     zColl = pList
18190 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a  Item->pExpr->u.z
181a0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f  Token;.      nCo
181b0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ll = sqlite3Strl
181c0 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b  en30(zColl) + 1;
181d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
181e0 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a  Extra>=nColl );.
181f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78        memcpy(zEx
18200 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c  tra, zColl, nCol
18210 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  l);.      zColl 
18220 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
18230 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b  zExtra += nColl;
18240 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d  .      nExtra -=
18250 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73   nColl;.    }els
18260 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  e{.      zColl =
18270 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
18280 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Coll;.      if( 
18290 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d  !zColl ) zColl =
182a0 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 7d   "BINARY";.    }
182b0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
182c0 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
182d0 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
182e0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
182f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
18300 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18310 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
18320 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
18330 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
18340 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
18350 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
18360 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
18370 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
18380 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
18390 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
183a0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28  rtOrder;.    if(
183b0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e   pTab->aCol[j].n
183c0 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 70 49 6e 64  otNull==0 ) pInd
183d0 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
183e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
183f0 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  Pk ){.    for(j=
18400 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
18410 6c 3b 20 6a 2b 2b 2c 20 69 2b 2b 29 7b 0a 20 20  l; j++, i++){.  
18420 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
18430 6c 75 6d 6e 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  lumn[i] = pPk->a
18440 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
18450 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
18460 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [i] = pPk->azCol
18470 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 49 6e 64  l[j];.      pInd
18480 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
18490 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72  ] = pPk->aSortOr
184a0 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  der[j];.    }.  
184b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65  }else{.    pInde
184c0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
184d0 20 2d 31 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d   -1;.    pIndex-
184e0 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 22 42 49  >azColl[i] = "BI
184f0 4e 41 52 59 22 3b 0a 20 20 7d 0a 20 20 73 71 6c  NARY";.  }.  sql
18500 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
18510 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  t(pIndex);.  if(
18520 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
18530 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65  le==0 ) estimate
18540 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65  IndexWidth(pInde
18550 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  x);..  if( pTab=
18560 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
18570 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
18580 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
18590 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
185a0 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
185b0 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
185c0 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
185d0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
185e0 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
185f0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
18600 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
18610 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
18620 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
18630 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
18640 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
18650 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
18660 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
18670 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
18680 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
18690 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
186a0 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
186b0 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
186c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
186d0 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
186e0 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
186f0 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
18700 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
18710 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
18720 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
18730 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
18740 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
18750 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
18760 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
18770 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
18780 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
18790 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
187a0 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
187b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20    **.    ** Two 
187c0 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
187d0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
187e0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
187f0 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
18800 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70  ** (and thus sup
18810 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63  pressing the sec
18820 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66  ond one) even if
18830 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65   they have diffe
18840 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74  rent.    ** sort
18850 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a   orders..    **.
18860 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
18870 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f  are different co
18880 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18890 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75  s or if the colu
188a0 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  mns of.    ** th
188b0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63  e constraint occ
188c0 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ur in different 
188d0 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65  orders, then the
188e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
188f0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
18900 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20  ed distinct and 
18910 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73  both result in s
18920 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e  eparate indices.
18930 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
18940 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
18950 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
18960 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
18970 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
18980 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
18990 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e  assert( pIdx->on
189a0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
189b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
189c0 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  pIdx->autoIndex 
189d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
189e0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
189f0 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20  !=OE_None );..  
18a00 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
18a10 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e  eyCol!=pIndex->n
18a20 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
18a30 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
18a40 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; k<pIdx->nKeyCo
18a50 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
18a60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b   const char *z1;
18a70 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
18a80 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  har *z2;.       
18a90 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
18aa0 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
18ab0 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
18ac0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  eak;.        z1 
18ad0 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  = pIdx->azColl[k
18ae0 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  ];.        z2 = 
18af0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  pIndex->azColl[k
18b00 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
18b10 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33  1!=z2 && sqlite3
18b20 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20  StrICmp(z1, z2) 
18b30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
18b40 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49  .      if( k==pI
18b50 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  dx->nKeyCol ){. 
18b60 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
18b70 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78  >onError!=pIndex
18b80 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20  ->onError ){.   
18b90 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
18ba0 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65  onstraint create
18bb0 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  s the same index
18bc0 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20   as a previous. 
18bd0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
18be0 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64  traint specified
18bf0 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68   somewhere in th
18c00 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
18c10 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
18c20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74      ** However t
18c30 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  he ON CONFLICT c
18c40 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65  lauses are diffe
18c50 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68  rent. If both th
18c60 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is .          **
18c70 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
18c80 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75  the previous equ
18c90 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69  ivalent constrai
18ca0 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74  nt have explicit
18cb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e  .          ** ON
18cc0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
18cd0 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72  s this is an err
18ce0 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  or. Otherwise, u
18cf0 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  se the.         
18d00 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73   ** explicitly s
18d10 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f  pecified behavio
18d20 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e  r for the index.
18d30 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
18d40 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49          if( !(pI
18d50 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
18d60 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65  Default || pInde
18d70 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
18d80 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20  efault) ){.     
18d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
18da0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dc0 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20  "conflicting ON 
18dd0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
18de0 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b   specified", 0);
18df0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18e00 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
18e10 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
18e20 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
18e30 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f      pIdx->onErro
18e40 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  r = pIndex->onEr
18e50 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ror;.          }
18e60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18e70 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18e80 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
18e90 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
18ea0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
18eb0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
18ec0 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
18ed0 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
18ee0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
18ef0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
18f00 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  . .  */.  if( db
18f10 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
18f20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
18f30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18f40 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
18f50 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
18f60 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70  Schema) );.    p
18f70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
18f80 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
18f90 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
18fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18fb0 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
18fc0 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  x->zName, sqlite
18fd0 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64 65 78  3Strlen30(pIndex
18fe0 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ->zName),.      
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20 20      pIndex);.   
19010 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
19020 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
19030 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
19040 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
19050 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   */.      db->ma
19060 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
19070 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
19080 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19090 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
190a0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
190b0 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
190c0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
190d0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
190e0 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
190f0 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
19100 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
19110 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
19120 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
19130 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
19140 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
19150 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
19160 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
19170 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
19180 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
19190 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
191a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
191b0 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
191c0 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
191d0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
191e0 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
191f0 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
19200 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
19210 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
19220 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
19230 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
19240 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
19250 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
19260 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
19270 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
19280 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
19290 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
192a0 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
192b0 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
192c0 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
192d0 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
192e0 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
192f0 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
19300 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
19310 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
19320 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
19330 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
19340 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
19350 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
19360 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
19370 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
19380 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
19390 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
193a0 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
193b0 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
193c0 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
193d0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
193e0 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
193f0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50  */.  else if( pP
19400 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b  arse->nErr==0 ){
19410 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
19420 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
19430 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
19440 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
19450 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
19460 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
19470 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
19480 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19490 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  ndex;...    /* C
194a0 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
194b0 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
194c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
194d0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
194e0 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
194f0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
19500 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19510 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
19520 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20   iDb, iMem);..  
19530 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
19540 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
19550 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
19560 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
19570 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
19580 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
19590 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
195a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
195b0 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e  = (int)(pParse->
195c0 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70  sLastToken.z - p
195d0 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73  Name->z) + pPars
195e0 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
195f0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
19600 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20  ->z[n-1]==';' ) 
19610 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  n--;.      /* A 
19620 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
19630 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
19640 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
19650 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
19660 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
19670 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25  ntf(db, "CREATE%
19680 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
19690 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d         onError==
196a0 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22  OE_None ? "" : "
196b0 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61   UNIQUE", n, pNa
196c0 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
196d0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
196e0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
196f0 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
19700 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
19710 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
19720 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
19730 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
19740 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
19750 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
19760 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
19770 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
19780 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
19790 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
197a0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
197b0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
197c0 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
197d0 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
197e0 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
197f0 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
19800 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
19810 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
19820 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
19830 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
19840 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
19850 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20  .        iMem,. 
19860 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
19870 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
19880 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
19890 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
198a0 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
198b0 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
198c0 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
198d0 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
198e0 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
198f0 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
19900 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
19910 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
19920 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
19930 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
19940 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
19950 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
19960 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
19970 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
19980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19990 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
199a0 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
199b0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
199c0 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
199d0 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
199e0 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
199f0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
19a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
19a10 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b  , OP_Expire, 0);
19a20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19a30 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
19a40 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
19a50 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
19a60 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
19a70 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
19a80 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
19a90 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
19aa0 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
19ab0 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
19ac0 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
19ad0 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
19ae0 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69  correct constrai
19af0 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72  nt check.  ** pr
19b00 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c  ocessing (in sql
19b10 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
19b20 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20  traintChecks()) 
19b30 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  as part of.  ** 
19b40 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52  UPDATE and INSER
19b50 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a  T statements.  .
19b60 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
19b70 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
19b80 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
19b90 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
19ba0 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
19bb0 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
19bc0 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
19bd0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
19be0 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
19bf0 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
19c00 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
19c10 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
19c20 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
19c30 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
19c40 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
19c50 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
19c60 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
19c70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
19c80 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
19c90 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
19ca0 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
19cb0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
19cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
19cd0 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
19ce0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
19cf0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
19d00 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
19d10 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78     pRet = pIndex
19d20 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  ;.    pIndex = 0
19d30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
19d40 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
19d50 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
19d60 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
19d70 70 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64  pIndex ) freeInd
19d80 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
19d90 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
19da0 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65  ete(db, pPIWhere
19db0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
19dc0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
19dd0 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
19de0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
19df0 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  , pTblName);.  s
19e00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
19e10 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
19e20 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
19e30 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
19e40 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
19e50 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
19e60 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
19e70 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
19e80 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
19e90 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
19ea0 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
19eb0 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
19ec0 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20  ] is suppose to 
19ed0 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
19ee0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
19ef0 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
19f00 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
19f10 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
19f20 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
19f30 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
19f40 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
19f50 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
19f60 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
19f70 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
19f80 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
19f90 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
19fa0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
19fb0 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
19fc0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
19fd0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
19fe0 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
19ff0 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
1a000 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65  biniation of the
1a010 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
1a020 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
1a030 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1a040 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
1a050 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1a060 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
1a070 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
1a080 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
1a090 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1a0a0 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
1a0b0 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
1a0c0 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
1a0d0 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
1a0e0 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
1a0f0 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
1a100 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
1a110 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
1a120 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
1a130 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
1a140 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
1a150 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
1a160 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
1a170 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
1a180 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
1a190 70 49 64 78 29 7b 0a 20 20 74 52 6f 77 63 6e 74  pIdx){.  tRowcnt
1a1a0 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
1a1b0 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  wEst;.  int i;. 
1a1c0 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 61 73   tRowcnt n;.  as
1a1d0 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20  sert( a!=0 );.  
1a1e0 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
1a1f0 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20  ble->nRowEst;.  
1a200 69 66 28 20 61 5b 30 5d 3c 31 30 20 29 20 61 5b  if( a[0]<10 ) a[
1a210 30 5d 20 3d 20 31 30 3b 0a 20 20 6e 20 3d 20 31  0] = 10;.  n = 1
1a220 30 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  0;.  for(i=1; i<
1a230 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  =pIdx->nKeyCol; 
1a240 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i++){.    a[i] =
1a250 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 35 20   n;.    if( n>5 
1a260 29 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28  ) n--;.  }.  if(
1a270 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1a280 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61  OE_None ){.    a
1a290 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20  [pIdx->nKeyCol] 
1a2a0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
1a2b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1a2c0 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
1a2d0 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
1a2e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1a2f0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
1a300 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
1a310 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
1a320 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
1a330 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a340 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
1a350 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
1a360 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
1a370 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
1a380 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1a390 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
1a3a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1a3b0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
1a3c0 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
1a3d0 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72  d with prior err
1a3e0 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ors */.  if( db-
1a3f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1a400 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1a410 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1a420 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
1a430 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
1a440 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1a450 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1a460 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
1a470 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1a480 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
1a490 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1a4a0 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
1a4b0 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
1a4c0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1a4d0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
1a4e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
1a4f0 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
1a500 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1a510 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1a520 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
1a530 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
1a540 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1a550 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
1a560 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
1a570 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1a580 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase);.    }.    
1a590 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1a5a0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
1a5b0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1a5c0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
1a5d0 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  dex->autoIndex )
1a5e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1a5f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
1a600 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1a610 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
1a620 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
1a630 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
1a640 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
1a650 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
1a660 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1a670 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1a680 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1a690 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
1a6a0 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20  chema);.#ifndef 
1a6b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
1a6c0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
1a6d0 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
1a6e0 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
1a6f0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1a700 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
1a710 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1a720 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
1a730 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
1a740 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1a750 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
1a760 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
1a770 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1a780 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
1a790 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
1a7a0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1a7b0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1a7c0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
1a7d0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1a7e0 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51   iDb ) code = SQ
1a7f0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
1a800 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
1a810 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1a820 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
1a830 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
1a840 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1a850 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a860 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
1a870 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1a880 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a890 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
1a8a0 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
1a8b0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
1a8c0 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1a8d0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1a8e0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1a8f0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1a900 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1a910 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
1a920 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1a930 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
1a940 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1a950 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
1a960 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  %Q AND type='ind
1a970 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  ex'",.       db-
1a980 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
1a990 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1a9a0 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  b), pIndex->zNam
1a9b0 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
1a9c0 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
1a9d0 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
1a9e0 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e   "idx", pIndex->
1a9f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1aa00 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
1aa10 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1aa20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
1aa30 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
1aa40 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
1aa50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1aa60 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op4(v, OP_DropIn
1aa70 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  dex, iDb, 0, 0, 
1aa80 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
1aa90 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
1aaa0 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
1aab0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1aac0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
1aad0 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61  *.** pArray is a
1aae0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61   pointer to an a
1aaf0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1ab00 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   Each object in 
1ab10 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20  the.** array is 
1ab20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e  szEntry bytes in
1ab30 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74   size. This rout
1ab40 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33  ine uses sqlite3
1ab50 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74  DbRealloc().** t
1ab60 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72  o extend the arr
1ab70 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ay so that there
1ab80 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20   is space for a 
1ab90 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68  new object at th
1aba0 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  e end..**.** Whe
1abb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1abc0 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e  is called, *pnEn
1abd0 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  try contains the
1abe0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1abf0 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69  .** the array (i
1ac00 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74  n entries - so t
1ac10 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
1ac20 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73   ((*pnEntry) * s
1ac30 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a  zEntry) bytes.**
1ac40 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a   in total)..**.*
1ac50 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  * If the realloc
1ac60 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  () is successful
1ac70 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d   (i.e. if no OOM
1ac80 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72   condition occur
1ac90 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  s), the.** space
1aca0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1acb0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
1acc0 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72   zeroed, *pnEntr
1acd0 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20  y updated to.** 
1ace0 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20  reflect the new 
1acf0 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
1ad00 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  y and a pointer 
1ad10 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  to the new alloc
1ad20 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65  ation.** returne
1ad30 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  d. *pIdx is set 
1ad40 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
1ad50 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e  the new array en
1ad60 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  try in this case
1ad70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ad80 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f  e, if the reallo
1ad90 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78  c() fails, *pIdx
1ada0 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a   is set to -1, *
1adb0 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a  pnEntry remains.
1adc0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
1add0 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61   a copy of pArra
1ade0 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76  y returned..*/.v
1adf0 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61  oid *sqlite3Arra
1ae00 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  yAllocate(.  sql
1ae10 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
1ae20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
1ae30 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
1ae40 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
1ae50 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20  oid *pArray,    
1ae60 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a   /* Array of obj
1ae70 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20  ects.  Might be 
1ae80 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  reallocated */. 
1ae90 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20   int szEntry,   
1aea0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
1aeb0 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1aec0 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
1aed0 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a  *pnEntry,     /*
1aee0 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   Number of objec
1aef0 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
1af00 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49  use */.  int *pI
1af10 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  dx         /* Wr
1af20 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66  ite the index of
1af30 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65   a new slot here
1af40 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
1af50 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45  ;.  int n = *pnE
1af60 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26  ntry;.  if( (n &
1af70 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20   (n-1))==0 ){.  
1af80 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30    int sz = (n==0
1af90 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20  ) ? 1 : 2*n;.   
1afa0 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71   void *pNew = sq
1afb0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1afc0 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a  b, pArray, sz*sz
1afd0 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20  Entry);.    if( 
1afe0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1aff0 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20   *pIdx = -1;.   
1b000 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79     return pArray
1b010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72  ;.    }.    pArr
1b020 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ay = pNew;.  }. 
1b030 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72   z = (char*)pArr
1b040 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b  ay;.  memset(&z[
1b050 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c  n * szEntry], 0,
1b060 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49   szEntry);.  *pI
1b070 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45  dx = n;.  ++*pnE
1b080 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70  ntry;.  return p
1b090 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Array;.}../*.** 
1b0a0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
1b0b0 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
1b0c0 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
1b0d0 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
1b0e0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
1b0f0 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
1b100 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
1b110 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
1b120 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
1b130 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
1b140 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20  tAppend(sqlite3 
1b150 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1b160 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
1b170 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
1b180 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1b190 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1b1a0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1b1b0 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  b, sizeof(IdList
1b1c0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1b1d0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
1b1e0 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1b1f0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
1b200 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64  llocate(.      d
1b210 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  b,.      pList->
1b220 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  a,.      sizeof(
1b230 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20  pList->a[0]),.  
1b240 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c      &pList->nId,
1b250 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
1b260 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
1b270 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1b280 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1b290 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1b2a0 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
1b2b0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1b2c0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1b2d0 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75   pToken);.  retu
1b2e0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
1b2f0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
1b300 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
1b310 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1b320 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
1b330 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1b340 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1b350 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1b360 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1b370 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
1b380 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1b390 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
1b3a0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
1b3b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1b3c0 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
1b3d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1b3e0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1b3f0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1b400 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
1b410 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
1b420 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
1b430 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
1b440 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
1b450 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
1b460 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
1b470 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1b480 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1b490 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1b4a0 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
1b4b0 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1b4c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1b4d0 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
1b4e0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
1b4f0 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
1b500 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1b510 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n -1;.}../*.** E
1b520 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20  xpand the space 
1b530 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1b540 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20  e given SrcList 
1b550 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65  object by.** cre
1b560 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77  ating nExtra new
1b570 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67   slots beginning
1b580 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74   at iStart.  iSt
1b590 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65  art is zero base
1b5a0 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20  d..** New slots 
1b5b0 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
1b5c0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73  * For example, s
1b5d0 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74  uppose a SrcList
1b5e0 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61   initially conta
1b5f0 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a  ins two entries:
1b600 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65   A,B..** To appe
1b610 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73  nd 3 new entries
1b620 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64   onto the end, d
1b630 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
1b640 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1b650 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c  nlarge(db, pSrcl
1b660 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a  ist, 3, 2);.**.*
1b670 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c  * After the call
1b680 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20   above it would 
1b690 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20  contain:  A, B, 
1b6a0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a  nil, nil, nil..*
1b6b0 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20  * If the iStart 
1b6c0 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65  argument had bee
1b6d0 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32  n 1 instead of 2
1b6e0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1b6f0 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  t.** would have 
1b700 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e  been:  A, nil, n
1b710 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20  il, nil, B.  To 
1b720 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20  prepend the new 
1b730 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53  slots,.** the iS
1b740 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64  tart value would
1b750 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75   be 0.  The resu
1b760 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a  lt then would.**
1b770 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e   be: nil, nil, n
1b780 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20  il, A, B..**.** 
1b790 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
1b7a0 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65  cation fails the
1b7b0 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68   SrcList is unch
1b7c0 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64  anged.  The.** d
1b7d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b7e0 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74  flag will be set
1b7f0 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63   to true..*/.Src
1b800 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1b810 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73  ListEnlarge(.  s
1b820 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1b830 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
1b840 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1b850 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73  fy of OOM errors
1b860 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1b870 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Src,     /* The 
1b880 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e  SrcList to be en
1b890 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  larged */.  int 
1b8a0 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f  nExtra,        /
1b8b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20  * Number of new 
1b8c0 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20  slots to add to 
1b8d0 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69  pSrc->a[] */.  i
1b8e0 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20  nt iStart       
1b8f0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53    /* Index in pS
1b900 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74  rc->a[] of first
1b910 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a   new slot */.){.
1b920 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53    int i;..  /* S
1b930 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
1b940 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65  n calling parame
1b950 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ters */.  assert
1b960 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20  ( iStart>=0 );. 
1b970 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
1b980 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1b990 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pSrc!=0 );.  ass
1b9a0 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72  ert( iStart<=pSr
1b9b0 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a  c->nSrc );..  /*
1b9c0 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69   Allocate additi
1b9d0 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65  onal space if ne
1b9e0 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53  eded */.  if( pS
1b9f0 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e  rc->nSrc+nExtra>
1ba00 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  pSrc->nAlloc ){.
1ba10 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
1ba20 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  w;.    int nAllo
1ba30 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  c = pSrc->nSrc+n
1ba40 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e  Extra;.    int n
1ba50 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  Got;.    pNew = 
1ba60 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1ba70 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20  (db, pSrc,.     
1ba80 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1ba90 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f  (*pSrc) + (nAllo
1baa0 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63  c-1)*sizeof(pSrc
1bab0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
1bac0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1bad0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1bae0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1baf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72        return pSr
1bb00 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  c;.    }.    pSr
1bb10 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47  c = pNew;.    nG
1bb20 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d  ot = (sqlite3DbM
1bb30 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e  allocSize(db, pN
1bb40 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53  ew) - sizeof(*pS
1bb50 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63  rc))/sizeof(pSrc
1bb60 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70  ->a[0])+1;.    p
1bb70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75  Src->nAlloc = (u
1bb80 38 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f  8)nGot;.  }..  /
1bb90 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20  * Move existing 
1bba0 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20  slots that come 
1bbb0 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20  after the newly 
1bbc0 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20  inserted slots. 
1bbd0 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77   ** out of the w
1bbe0 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53  ay */.  for(i=pS
1bbf0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69  rc->nSrc-1; i>=i
1bc00 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20  Start; i--){.   
1bc10 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72   pSrc->a[i+nExtr
1bc20 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b  a] = pSrc->a[i];
1bc30 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72  .  }.  pSrc->nSr
1bc40 63 20 2b 3d 20 28 69 38 29 6e 45 78 74 72 61 3b  c += (i8)nExtra;
1bc50 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
1bc60 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
1bc70 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
1bc80 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
1bc90 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
1bca0 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
1bcb0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
1bcc0 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
1bcd0 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
1bce0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
1bcf0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1bd00 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1bd10 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
1bd20 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
1bd30 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
1bd40 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1bd50 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
1bd60 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1bd70 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
1bd80 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
1bd90 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
1bda0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
1bdb0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
1bdc0 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
1bdd0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
1bde0 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
1bdf0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1be00 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
1be10 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
1be20 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
1be30 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
1be40 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
1be50 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
1be60 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
1be70 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
1be80 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
1be90 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
1bea0 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
1beb0 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
1bec0 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
1bed0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
1bee0 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
1bef0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
1bf00 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
1bf10 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1bf20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
1bf30 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
1bf40 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
1bf50 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
1bf60 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
1bf70 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
1bf80 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
1bf90 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
1bfa0 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
1bfb0 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
1bfc0 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
1bfd0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
1bfe0 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
1bff0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
1c000 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
1c010 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
1c020 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
1c030 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
1c040 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
1c050 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
1c060 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
1c070 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
1c080 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
1c090 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
1c0a0 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
1c0b0 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
1c0c0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
1c0d0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
1c0e0 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
1c0f0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1c100 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1c110 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
1c120 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
1c130 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1c140 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
1c150 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
1c160 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
1c170 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1c180 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1c190 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
1c1a0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
1c1b0 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
1c1c0 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
1c1d0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
1c1e0 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64   If C is defined
1c1f0 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42  .** then so is B
1c200 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1c210 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65  s, we never have
1c220 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a   a case where:.*
1c230 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1c240 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1c250 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,0,C);.**.*
1c260 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e  * Both pTable an
1c270 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20  d pDatabase are 
1c280 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75  assumed to be qu
1c290 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20  oted.  They are 
1c2a0 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f  dequoted.** befo
1c2b0 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  re being added t
1c2c0 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a  o the SrcList..*
1c2d0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1c2e0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1c2f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1c300 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1c310 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1c320 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1c330 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1c340 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
1c350 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
1c360 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
1c370 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
1c380 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1c390 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
1c3a0 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
1c3b0 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1c3c0 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
1c3d0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
1c3e0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1c3f0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1c400 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  m;.  assert( pDa
1c410 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
1c420 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
1c430 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
1c440 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70  out B */.  if( p
1c450 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1c460 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1c470 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1c480 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
1c490 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1c4a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1c4b0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1c4c0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73   = 1;.  }.  pLis
1c4d0 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  t = sqlite3SrcLi
1c4e0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c  stEnlarge(db, pL
1c4f0 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e  ist, 1, pList->n
1c500 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  Src);.  if( db->
1c510 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1c520 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1c530 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1c540 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1c550 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
1c560 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
1c570 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
1c580 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
1c590 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
1c5a0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1c5b0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
1c5c0 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54  atabase ){.    T
1c5d0 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
1c5e0 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
1c5f0 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
1c600 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
1c610 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
1c620 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
1c630 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1c640 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49  b, pTable);.  pI
1c650 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1c660 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1c670 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62  Token(db, pDatab
1c680 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ase);.  return p
1c690 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
1c6a0 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72  ssign VdbeCursor
1c6b0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74   index numbers t
1c6c0 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
1c6d0 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
1c6e0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1c6f0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
1c700 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1c710 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1c720 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1c730 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1c740 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
1c750 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
1c760 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c770 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
1c780 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
1c790 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
1c7a0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1c7b0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1c7c0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
1c7d0 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
1c7e0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
1c7f0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
1c800 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
1c810 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
1c820 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1c830 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1c840 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
1c850 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
1c860 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
1c870 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1c880 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
1c890 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
1c8a0 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
1c8b0 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
1c8c0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1c8d0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
1c8e0 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
1c8f0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1c900 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c910 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c920 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1c930 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
1c940 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1c950 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
1c960 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1c970 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1c980 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
1c990 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
1c9a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1c9b0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1c9c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c9d0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
1c9e0 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  s);.    sqlite3D
1c9f0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1ca00 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71  >zIndex);.    sq
1ca10 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
1ca20 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  (db, pItem->pTab
1ca30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1ca40 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1ca50 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
1ca60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1ca70 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1ca80 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
1ca90 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1caa0 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  b, pItem->pUsing
1cab0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1cac0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1cad0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1cae0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1caf0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1cb00 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65   to add a new te
1cb10 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  rm to the.** end
1cb20 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52   of a growing FR
1cb30 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
1cb40 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
1cb50 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   the part of.** 
1cb60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1cb70 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1cb80 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
1cb90 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a  d.  "p" is NULL.
1cba0 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
1cbb0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
1cbc0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
1cbd0 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61    pTable and pDa
1cbe0 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68  tabase.** are th
1cbf0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1cc00 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65  ble and database
1cc10 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
1cc20 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OM clause term..
1cc30 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20  ** pDatabase is 
1cc40 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61  NULL if the data
1cc50 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66  base name qualif
1cc60 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d  ier is missing -
1cc70 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61   the.** usual ca
1cc80 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  se.  If the term
1cc90 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68   has a alias, th
1cca0 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73  en pAlias points
1ccb0 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73   to the.** alias
1ccc0 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20   token.  If the 
1ccd0 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65  term is a subque
1cce0 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65  ry, then pSubque
1ccf0 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c  ry is the.** SEL
1cd00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
1cd10 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
1cd20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54  encodes.  The pT
1cd30 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74  able and.** pDat
1cd40 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73  abase parameters
1cd50 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75   are NULL for su
1cd60 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70  bqueries.  The p
1cd70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a  On and pUsing.**
1cd80 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1cd90 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
1cda0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
1cdb0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  clauses..**.** R
1cdc0 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c  eturn a new SrcL
1cdd0 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65  ist which encode
1cde0 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69  s is the FROM wi
1cdf0 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65  th the new.** te
1ce00 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63  rm added..*/.Src
1ce10 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1ce20 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
1ce30 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1ce40 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
1ce50 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1ce60 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1ce70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1ce80 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f   The left part o
1ce90 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1cea0 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a  e already seen *
1ceb0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
1cec0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  e,          /* N
1ced0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1cee0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46   to add to the F
1cef0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1cf00 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
1cf10 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ,       /* Name 
1cf20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1cf30 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c  containing pTabl
1cf40 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41  e */.  Token *pA
1cf50 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f  lias,          /
1cf60 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64  * The right-hand
1cf70 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20   side of the AS 
1cf80 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1cf90 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
1cfa0 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20  uery,      /* A 
1cfb0 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e  subquery used in
1cfc0 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c   place of a tabl
1cfd0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
1cfe0 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20   *pOn,          
1cff0 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c      /* The ON cl
1d000 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1d010 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69  /.  IdList *pUsi
1d020 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng          /* T
1d030 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
1d040 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a  of a join */.){.
1d050 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1d060 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1d070 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d080 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1d090 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55  !p && (pOn || pU
1d0a0 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  sing) ){.    sql
1d0b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1d0c0 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61  rse, "a JOIN cla
1d0d0 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
1d0e0 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20  before %s", .   
1d0f0 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a     (pOn ? "ON" :
1d100 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b   "USING").    );
1d110 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
1d120 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
1d130 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72  .  p = sqlite3Sr
1d140 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
1d150 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61  p, pTable, pData
1d160 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
1d170 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53  0 || NEVER(p->nS
1d180 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f  rc==0) ){.    go
1d190 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1d1a0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65  rror;.  }.  pIte
1d1b0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
1d1c0 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  c-1];.  assert( 
1d1d0 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69  pAlias!=0 );.  i
1d1e0 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a  f( pAlias->n ){.
1d1f0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
1d200 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
1d210 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c  romToken(db, pAl
1d220 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  ias);.  }.  pIte
1d230 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75  m->pSelect = pSu
1d240 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d  bquery;.  pItem-
1d250 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49  >pOn = pOn;.  pI
1d260 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55  tem->pUsing = pU
1d270 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70  sing;.  return p
1d280 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  ;.. append_from_
1d290 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28  error:.  assert(
1d2a0 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   p==0 );.  sqlit
1d2b0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1d2c0 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33   pOn);.  sqlite3
1d2d0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1d2e0 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69   pUsing);.  sqli
1d2f0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1d300 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a  db, pSubquery);.
1d310 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1d320 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45  *.** Add an INDE
1d330 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e  XED BY or NOT IN
1d340 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20  DEXED clause to 
1d350 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1d360 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d  y added .** elem
1d370 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63  ent of the sourc
1d380 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  e-list passed as
1d390 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1d3a0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1d3b0 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
1d3c0 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61  xedBy(Parse *pPa
1d3d0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
1d3e0 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64   Token *pIndexed
1d3f0 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  By){.  assert( p
1d400 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a  IndexedBy!=0 );.
1d410 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59    if( p && ALWAY
1d420 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a  S(p->nSrc>0) ){.
1d430 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1d440 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1d450 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1d460 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1d470 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
1d480 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49  ==0 && pItem->zI
1d490 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ndex==0 );.    i
1d4a0 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  f( pIndexedBy->n
1d4b0 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64  ==1 && !pIndexed
1d4c0 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f  By->z ){.      /
1d4d0 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44  * A "NOT INDEXED
1d4e0 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70  " clause was sup
1d4f0 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65  plied. See parse
1d500 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  .y .      ** con
1d510 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f  struct "indexed_
1d520 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73  opt" for details
1d530 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d  . */.      pItem
1d540 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  ->notIndexed = 1
1d550 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d560 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78     pItem->zIndex
1d570 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1d580 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1d590 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
1d5a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1d5b0 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
1d5c0 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
1d5d0 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
1d5e0 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
1d5f0 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
1d600 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
1d610 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
1d620 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
1d630 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
1d640 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
1d650 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
1d660 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1d670 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1d680 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
1d690 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
1d6a0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1d6b0 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
1d6c0 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
1d6d0 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
1d6e0 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
1d6f0 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1d700 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
1d710 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
1d720 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
1d730 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
1d740 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
1d750 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
1d760 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
1d770 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
1d780 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
1d790 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
1d7a0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
1d7b0 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
1d7c0 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
1d7d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
1d7e0 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
1d7f0 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
1d800 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1d810 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
1d820 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
1d830 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
1d840 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
1d850 70 2d 3e 61 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d  p->a || p->nSrc=
1d860 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
1d870 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20  p->nSrc-1; i>0; 
1d880 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i--){.      p->a
1d890 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  [i].jointype = p
1d8a0 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
1d8b0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  e;.    }.    p->
1d8c0 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[0].jointype = 
1d8d0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1d8e0 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
1d8f0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1d900 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
1d910 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1d920 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
1d930 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
1d940 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
1d950 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1d960 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
1d970 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1d980 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f  sert( db!=0 );./
1d990 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30  *  if( db->aDb[0
1d9a0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1d9b0 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  n; */.  if( sqli
1d9c0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1d9d0 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1d9e0 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
1d9f0 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
1da00 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
1da10 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1da20 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
1da30 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
1da40 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
1da50 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
1da60 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1da70 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1da80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1da90 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
1daa0 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
1dab0 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
1dac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1dad0 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
1dae0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1daf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1db00 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
1db10 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
1db20 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
1db30 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1db40 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
1db50 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1db60 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  e){.  Vdbe *v;..
1db70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1db80 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1db90 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
1dba0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
1dbb0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1dbc0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1dbd0 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
1dbe0 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1dbf0 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1dc00 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1dc10 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1dc20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1dc30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1dc40 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a  oCommit, 1, 0);.
1dc50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
1dc60 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1dc70 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1dc80 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
1dc90 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
1dca0 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
1dcb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1dcc0 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
1dcd0 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
1dce0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
1dcf0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1dd00 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1dd10 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
1dd20 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  K", 0, 0) ){.   
1dd30 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1dd40 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1dd50 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1dd60 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1dd70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dd80 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1dd90 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
1dda0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ddb0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1ddc0 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
1ddd0 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64  parses a command
1dde0 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72   to create,.** r
1ddf0 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1de00 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f  ck an SQL savepo
1de10 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  int. .*/.void sq
1de20 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50  lite3Savepoint(P
1de30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1de40 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  t op, Token *pNa
1de50 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
1de60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1de70 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1de80 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
1de90 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
1dea0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
1deb0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1dec0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1ded0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1dee0 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20  TION.    static 
1def0 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
1df00 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47  st az[] = { "BEG
1df10 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20  IN", "RELEASE", 
1df20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20  "ROLLBACK" };.  
1df30 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50    assert( !SAVEP
1df40 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41  OINT_BEGIN && SA
1df50 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d  VEPOINT_RELEASE=
1df60 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  =1 && SAVEPOINT_
1df70 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23  ROLLBACK==2 );.#
1df80 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76  endif.    if( !v
1df90 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43   || sqlite3AuthC
1dfa0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1dfb0 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61  ITE_SAVEPOINT, a
1dfc0 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29  z[op], zName, 0)
1dfd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1dfe0 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1dff0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
1e000 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1e010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e020 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65  ddOp4(v, OP_Save
1e030 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c  point, op, 0, 0,
1e040 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d   zName, P4_DYNAM
1e050 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
1e060 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1e070 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
1e080 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
1e090 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
1e0a0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
1e0b0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
1e0c0 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
1e0d0 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
1e0e0 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
1e0f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
1e100 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
1e110 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1e120 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e130 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1e140 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
1e150 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
1e160 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
1e170 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65  nt rc;.    Btree
1e180 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69   *pBt;.    stati
1e190 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67  c const int flag
1e1a0 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53  s = .          S
1e1b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1e1c0 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  RITE |.         
1e1d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1e1e0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
1e1f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1e200 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
1e210 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
1e220 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
1e230 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1e240 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20  PEN_TEMP_DB;..  
1e250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e260 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
1e270 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30  , 0, db, &pBt, 0
1e280 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
1e290 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e2a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e2b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1e2c0 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
1e2d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
1e2e0 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
1e2f0 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
1e300 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
1e310 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
1e320 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
1e330 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1e340 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31   }.    db->aDb[1
1e350 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ].pBt = pBt;.   
1e360 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
1e370 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
1e380 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f     if( SQLITE_NO
1e390 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  MEM==sqlite3Btre
1e3a0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74  eSetPageSize(pBt
1e3b0 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69  , db->nextPagesi
1e3c0 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20  ze, -1, 0) ){.  
1e3d0 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
1e3e0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
1e3f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1e400 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1e410 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1e420 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1e430 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
1e440 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
1e450 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65  nd start.** a re
1e460 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ad-transaction f
1e470 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74  or all named dat
1e480 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a  abase files..**.
1e490 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  ** It is importa
1e4a0 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65  nt that all sche
1e4b0 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65  ma cookies be ve
1e4c0 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a  rified and all.*
1e4d0 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  * read transacti
1e4e0 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62  ons be started b
1e4f0 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65  efore anything e
1e500 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  lse happens in.*
1e510 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  * the VDBE progr
1e520 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  am.  But this ro
1e530 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
1e540 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f  led after much o
1e550 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73  ther.** code has
1e560 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
1e570 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61    So here is wha
1e580 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54  t we do:.**.** T
1e590 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
1e5a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1e5b0 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e  lled, we code an
1e5c0 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a   OP_Goto that.**
1e5d0 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
1e5e0 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
1e5f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
1e600 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
1e610 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
1e620 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
1e630 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
1e640 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
1e650 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
1e660 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
1e670 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
1e680 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
1e690 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
1e6a0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
1e6b0 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
1e6c0 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
1e6d0 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
1e6e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
1e6f0 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
1e700 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32  d the OP_Goto P2
1e710 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
1e720 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
1e730 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69  to that subrouti
1e740 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74  ne.  The generat
1e750 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ion of the.** co
1e760 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
1e770 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64  n subroutine cod
1e780 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c  e happens in sql
1e790 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
1e7a0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ()..**.** If iDb
1e7b0 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65  <0 then code the
1e7c0 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20   OP_Goto only - 
1e7d0 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74  don't set flag t
1e7e0 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20  o verify the.** 
1e7f0 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61  schema on any da
1e800 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63  tabases.  This c
1e810 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f  an be used to po
1e820 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f  sition the OP_Go
1e830 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74  to.** early in t
1e840 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20  he code, before 
1e850 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64  we know if any d
1e860 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77  atabase tables w
1e870 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  ill be used..*/.
1e880 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
1e890 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
1e8a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1e8b0 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
1e8c0 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1e8d0 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1e8e0 70 50 61 72 73 65 29 3b 0a 0a 23 69 66 6e 64 65  pParse);..#ifnde
1e8f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1e900 49 47 47 45 52 0a 20 20 69 66 28 20 70 54 6f 70  IGGER.  if( pTop
1e910 6c 65 76 65 6c 21 3d 70 50 61 72 73 65 20 29 7b  level!=pParse ){
1e920 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
1e930 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
1e940 61 20 74 72 69 67 67 65 72 20 69 73 20 63 75 72  a trigger is cur
1e950 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 64  rently being cod
1e960 65 64 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20  ed. In this.    
1e970 2a 2a 20 63 61 73 65 2c 20 73 65 74 20 63 6f 6f  ** case, set coo
1e980 6b 69 65 47 6f 74 6f 20 74 6f 20 61 20 6e 6f 6e  kieGoto to a non
1e990 2d 7a 65 72 6f 20 76 61 6c 75 65 20 74 6f 20 73  -zero value to s
1e9a0 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 66 75  how that this fu
1e9b0 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  nction.    ** ha
1e9c0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20 54  s been called. T
1e9d0 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
1e9e0 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  he sqlite3ExprCo
1e9f0 64 65 43 6f 6e 73 74 61 6e 74 73 28 29 0a 20 20  deConstants().  
1ea00 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 2a    ** function. *
1ea10 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  /.    pParse->co
1ea20 6f 6b 69 65 47 6f 74 6f 20 3d 20 2d 31 3b 0a 20  okieGoto = -1;. 
1ea30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
1ea40 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
1ea50 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
1ea60 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1ea70 33 47 65 74 56 64 62 65 28 70 54 6f 70 6c 65 76  3GetVdbe(pToplev
1ea80 65 6c 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  el);.    if( v==
1ea90 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
1eaa0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1eab0 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
1eac0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a   prior error */.
1ead0 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63      pToplevel->c
1eae0 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69  ookieGoto = sqli
1eaf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1eb00 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b   OP_Goto, 0, 0)+
1eb10 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62  1;.  }.  if( iDb
1eb20 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
1eb30 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76  e3 *db = pToplev
1eb40 65 6c 2d 3e 64 62 3b 0a 20 20 20 20 79 44 62 4d  el->db;.    yDbM
1eb50 61 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 61  ask mask;..    a
1eb60 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e  ssert( iDb<db->n
1eb70 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
1eb80 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
1eb90 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
1eba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1ebb0 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db<SQLITE_MAX_AT
1ebc0 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20  TACHED+2 );.    
1ebd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1ebe0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1ebf0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
1ec00 20 20 6d 61 73 6b 20 3d 20 28 28 79 44 62 4d 61    mask = ((yDbMa
1ec10 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 20 20  sk)1)<<iDb;.    
1ec20 69 66 28 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  if( (pToplevel->
1ec30 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73  cookieMask & mas
1ec40 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  k)==0 ){.      p
1ec50 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1ec60 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1ec70 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63      pToplevel->c
1ec80 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20  ookieValue[iDb] 
1ec90 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
1eca0 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
1ecb0 6f 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28  ookie;.      if(
1ecc0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1ecd0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
1ece0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
1ecf0 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c  mpDatabase(pTopl
1ed00 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  evel);.      }. 
1ed10 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1ed20 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44  * If argument zD
1ed30 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  b is NULL, then 
1ed40 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65  call sqlite3Code
1ed50 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66  VerifySchema() f
1ed60 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61  or each .** atta
1ed70 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f  ched database. O
1ed80 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65  therwise, invoke
1ed90 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61   it for the data
1eda0 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f  base named zDb o
1edb0 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
1edc0 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
1edd0 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20  medSchema(Parse 
1ede0 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1edf0 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c  har *zDb){.  sql
1ee00 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1ee10 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
1ee20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
1ee30 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
1ee40 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
1ee50 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
1ee60 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62  Db->pBt && (!zDb
1ee70 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   || 0==sqlite3St
1ee80 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e  rICmp(zDb, pDb->
1ee90 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20  zName)) ){.     
1eea0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1eeb0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
1eec0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
1eed0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1eee0 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1eef0 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
1ef00 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
1ef10 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1ef20 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
1ef30 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1ef40 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
1ef50 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
1ef60 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
1ef70 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
1ef80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
1ef90 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
1efa0 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
1efb0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
1efc0 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
1efd0 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
1efe0 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
1eff0 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
1f000 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
1f010 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
1f020 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
1f030 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
1f040 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
1f050 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
1f060 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
1f070 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
1f080 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
1f090 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1f0a0 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
1f0b0 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
1f0c0 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
1f0d0 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
1f0e0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
1f0f0 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
1f100 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1f110 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
1f120 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
1f130 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
1f140 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
1f150 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
1f160 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
1f170 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
1f180 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
1f190 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
1f1a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1f1b0 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
1f1c0 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
1f1d0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1f1e0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1f1f0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
1f200 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1f210 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
1f220 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
1f230 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28 28 79  writeMask |= ((y
1f240 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a  DbMask)1)<<iDb;.
1f250 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
1f260 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74  ultiWrite |= set
1f270 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a  Statement;.}../*
1f280 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
1f290 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1f2a0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
1f2b0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67  construction mig
1f2c0 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65  ht write.** more
1f2d0 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20   than one entry 
1f2e0 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69  (example: deleti
1f2f0 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20  ng one row then 
1f300 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65  inserting anothe
1f310 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20  r,.** inserting 
1f320 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e  multiple rows in
1f330 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73   a table, or ins
1f340 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64  erting a row and
1f350 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29   index entries.)
1f360 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20  .** If an abort 
1f370 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d  occurs after som
1f380 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65  e of these write
1f390 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64  s have completed
1f3a0 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a  , then it will.*
1f3b0 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
1f3c0 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c  o undo the compl
1f3d0 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a  eted writes..*/.
1f3e0 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74  void sqlite3Mult
1f3f0 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50  iWrite(Parse *pP
1f400 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
1f410 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1f420 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1f430 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
1f440 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
1f450 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a  ite = 1;.}../* .
1f460 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1f470 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73  rator calls this
1f480 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64   routine if is d
1f490 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74  iscovers that it
1f4a0 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20   is.** possible 
1f4b0 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65  to abort a state
1f4c0 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f  ment prior to co
1f4d0 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72  mpletion.  In or
1f4e0 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f  der to .** perfo
1f4f0 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69  rm this abort wi
1f500 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67  thout corrupting
1f510 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77   the database, w
1f520 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a  e need to make.*
1f530 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  * sure that the 
1f540 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f  statement is pro
1f550 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74  tected by a stat
1f560 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1f570 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63  n..**.** Technic
1f580 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65  ally, we only ne
1f590 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  ed to set the ma
1f5a0 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74  yAbort flag if t
1f5b0 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69  he.** isMultiWri
1f5c0 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76  te flag was prev
1f5d0 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65  iously set.  The
1f5e0 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70  re is a time dep
1f5f0 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20  endency.** such 
1f600 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d  that the abort m
1f610 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20  ust occur after 
1f620 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20  the multiwrite. 
1f630 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73   This makes.** s
1f640 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ome statements i
1f650 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50  nvolving the REP
1f660 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65  LACE conflict re
1f670 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
1f680 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c  hm.** go a littl
1f690 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74  e faster.  But t
1f6a0 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20  aking advantage 
1f6b0 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70  of this time dep
1f6c0 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73  endency.** makes
1f6d0 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75   it more difficu
1f6e0 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74  lt to prove that
1f6f0 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72   the code is cor
1f700 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72  rect (in .** par
1f710 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76  ticular, it prev
1f720 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69  ents us from wri
1f730 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76  ting an effectiv
1f740 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1f750 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73  ion of sqlite3As
1f760 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20  sertMayAbort()) 
1f770 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63  and so we have c
1f780 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65  hosen.** to take
1f790 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20   the safe route 
1f7a0 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74  and skip the opt
1f7b0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  imization..*/.vo
1f7c0 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  id sqlite3MayAbo
1f7d0 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rt(Parse *pParse
1f7e0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1f7f0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1f800 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1f810 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
1f820 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b  l->mayAbort = 1;
1f830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
1f840 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63  n OP_Halt that c
1f850 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74  auses the vdbe t
1f860 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  o return an SQLI
1f870 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a  TE_CONSTRAINT.**
1f880 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72   error. The onEr
1f890 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  ror parameter de
1f8a0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28  termines which (
1f8b0 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73  if any) of the s
1f8c0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f  tatement.** and/
1f8d0 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  or current trans
1f8e0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1f8f0 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   back..*/.void s
1f900 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
1f910 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
1f920 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1f930 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1f940 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20    int errCode,  
1f950 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20      /* extended 
1f960 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
1f970 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
1f980 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
1f990 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  type */.  char *
1f9a0 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  p4,         /* E
1f9b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
1f9c0 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1f9d0 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43      /* P4_STATIC
1f9e0 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54   or P4_TRANSIENT
1f9f0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
1fa00 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1fa10 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
1fa20 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78  ert( (errCode&0x
1fa30 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
1fa40 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20  TRAINT );.  if( 
1fa50 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72  onError==OE_Abor
1fa60 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
1fa70 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
1fa80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1fa90 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1faa0 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f  Halt, errCode, o
1fab0 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70  nError, 0, p4, p
1fac0 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  4type);.}../*.**
1fad0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1fae0 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
1faf0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1fb00 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
1fb10 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
1fb20 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
1fb30 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
1fb40 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1fb50 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
1fb60 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
1fb70 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
1fb80 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
1fb90 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
1fba0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
1fbb0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Coll!=0 );.  for
1fbc0 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
1fbd0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
1fbe0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1fbf0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
1fc00 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l[i];.    assert
1fc10 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ( z!=0 || pIndex
1fc20 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20  ->aiColumn[i]<0 
1fc30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
1fc40 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  x->aiColumn[i]>=
1fc50 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  0 && 0==sqlite3S
1fc60 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
1fc70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1fc80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1fc90 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1fca0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
1fcb0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
1fcc0 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
1fcd0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1fce0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
1fcf0 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
1fd00 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
1fd10 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
1fd20 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1fd30 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1fd40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
1fd50 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
1fd60 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
1fd70 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
1fd80 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65   *zColl){.  Inde
1fd90 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
1fda0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1fdb0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1fdc0 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66  ith pTab */..  f
1fdd0 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
1fde0 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
1fdf0 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
1fe00 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a  Next){.    if( z
1fe10 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
1fe20 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
1fe30 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
1fe40 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
1fe50 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1fe60 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
1fe70 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
1fe80 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1fe90 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1fea0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
1feb0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
1fec0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1fed0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
1fee0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
1fef0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
1ff00 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
1ff10 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
1ff20 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
1ff30 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
1ff40 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
1ff50 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1ff60 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
1ff70 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
1ff80 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
1ff90 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
1ffa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ffb0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
1ffc0 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
1ffd0 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
1ffe0 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  rse, char const 
1fff0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *zColl){.  Db *p
20000 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
20010 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
20020 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
20030 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20050 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
20060 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
20070 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
20080 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
20090 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
200a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
200b0 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
200c0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
200d0 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
200e0 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
200f0 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
20100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
20110 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
20120 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  base */..  asser
20130 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
20140 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
20150 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64  b) );  /* Needed
20160 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
20170 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d  ss */.  for(iDb=
20180 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
20190 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
201a0 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
201b0 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29  assert( pDb!=0 )
201c0 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
201d0 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
201e0 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
201f0 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
20200 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
20210 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
20220 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
20230 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
20240 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
20250 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  , pTab, zColl);.
20260 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
20270 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
20280 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
20290 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
202a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
202b0 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
202c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202d0 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
202e0 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
202f0 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
20300 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
20310 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
20320 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
20330 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
20340 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
20350 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
20360 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
20370 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
20380 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
20390 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
203a0 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
203b0 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
203c0 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
203d0 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
203e0 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
203f0 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
20400 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
20410 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
20420 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
20430 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
20440 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
20450 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
20460 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
20470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20480 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
20490 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
204a0 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
204b0 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
204c0 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
204d0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
204e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
204f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
20500 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
20510 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
20520 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
20530 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
20540 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
20550 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
20560 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
20570 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
20580 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
20590 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
205b0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
205c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
205d0 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
205e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
205f0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
20600 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
20610 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
20620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20630 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
20640 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
20650 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20660 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
20670 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
20680 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
20690 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
206a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
206b0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
206c0 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
206d0 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
206e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
206f0 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
20700 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
20710 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
20720 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
20730 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
20740 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
20750 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
20760 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
20770 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
20780 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
20790 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
207a0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
207b0 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
207c0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
207d0 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70  else if( NEVER(p
207e0 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61  Name2==0) || pNa
207f0 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
20800 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
20810 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
20820 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
20830 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
20840 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
20850 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
20860 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
20870 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
20880 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
20890 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
208a0 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , zColl, 0);.   
208b0 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
208c0 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
208d0 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
208e0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
208f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
20900 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
20910 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
20920 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
20930 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62  Coll);.  }.  iDb
20940 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
20950 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
20960 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
20970 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
20980 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
20990 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
209a0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
209b0 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
209c0 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
209d0 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
209e0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  Db].zName;.  pTa
209f0 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
20a00 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29  able(db, z, zDb)
20a10 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  ;.  if( pTab ){.
20a20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
20a30 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
20a40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
20a50 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
20a60 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
20a70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
20a80 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20  indIndex(db, z, 
20a90 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  zDb);.  sqlite3D
20aa0 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
20ab0 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
20ac0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
20ad0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
20ae0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
20af0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
20b00 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
20b10 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  dex, -1);.    re
20b20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
20b30 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20b40 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69  se, "unable to i
20b50 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65  dentify the obje
20b60 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ct to be reindex
20b70 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ed");.}.#endif..
20b80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64  /*.** Return a d
20b90 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74  ynamicly allocat
20ba0 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ed KeyInfo struc
20bb0 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65  ture that can be
20bc0 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50   used.** with OP
20bd0 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f  _OpenRead or OP_
20be0 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63  OpenWrite to acc
20bf0 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64  ess database ind
20c00 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49  ex pIdx..**.** I
20c10 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  f successful, a 
20c20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
20c30 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ew structure is 
20c40 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
20c50 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61  s case.** the ca
20c60 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
20c70 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20  ble for calling 
20c80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20c90 2c 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  , ) on the retur
20ca0 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  ned .** pointer.
20cb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
20cc0 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f  urs (out of memo
20cd0 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f  ry or missing co
20ce0 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75  llation .** sequ
20cf0 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72  ence), NULL is r
20d00 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
20d10 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20  state of pParse 
20d20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
20d30 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  ct.** the error.
20d40 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
20d50 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
20d60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20d70 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
20d80 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
20d90 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
20da0 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20  n;.  int nKey = 
20db0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
20dc0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a   KeyInfo *pKey;.
20dd0 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  .  pKey = sqlite
20de0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50  3KeyInfoAlloc(pP
20df0 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20  arse->db, nKey, 
20e00 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 69 66  nCol-nKey);.  if
20e10 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 66 6f  ( pKey ){.    fo
20e20 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
20e30 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
20e40 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
20e50 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
20e60 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 29 20 7a  if( zColl==0 ) z
20e70 43 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b  Coll = "BINARY";
20e80 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f  .      pKey->aCo
20e90 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c  ll[i] = sqlite3L
20ea0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
20eb0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
20ec0 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
20ed0 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
20ee0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
20ef0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
20f00 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
20f10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20f20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4b 65  (pParse->db, pKe
20f30 79 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30  y);.    pKey = 0
20f40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
20f50 4b 65 79 3b 0a 7d 0a                             Key;.}.