/ Hex Artifact Content
Login

Artifact 6970691b8d22c6eb2c1ab0078e4d25c939acfdad:


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 33 28 76  ite3VdbeAddOp3(v
5050: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5060: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5070: 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
5080: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
5090: 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50 34  1, (char *)5, P4
50a0: 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20 63  _INT32);  /* 5 c
50b0: 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  olumn table */. 
50c0: 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20   if( p->nTab==0 
50d0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d  ){.    p->nTab =
50e0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
50f0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
5100: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c   points to a nul
5110: 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66  -terminated buff
5120: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
5130: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64  e name.** of a d
5140: 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c  atabase ("main",
5150: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
5160: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
5170: 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20  ed db). This.** 
5180: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5190: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
51a0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
51b0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
51c0: 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e  r.** -1 if the n
51d0: 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62  amed db cannot b
51e0: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
51f0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
5200: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
5210: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5220: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
5230: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5240: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5250: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
5260: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69    Db *pDb;.    i
5270: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
5280: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
5290: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
52a0: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
52b0: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
52c0: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
52d0: 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44  if( (!OMIT_TEMPD
52e0: 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e  B || i!=1 ) && n
52f0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
5300: 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26  0(pDb->zName) &&
5310: 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73   .          0==s
5320: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 44  qlite3StrICmp(pD
5330: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  b->zName, zName)
5340: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
5350: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
5370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
5380: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
5390: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
53a0: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
53b0: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
53c0: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
53d0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
53e0: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
53f0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
5400: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
5410: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
5420: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
5430: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
5440: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
5450: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  exist..*/.int sq
5460: 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69  lite3FindDb(sqli
5470: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
5480: 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pName){.  int i;
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 20 20 20 20 20 20 2f                 /
54b0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
54c0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  r */.  char *zNa
54d0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
54f0: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
5500: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e  hing for */.  zN
5510: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
5520: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
5530: 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c  Name);.  i = sql
5540: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
5550: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  b, zName);.  sql
5560: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
5570: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
5580: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
5590: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
55a0: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
55b0: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
55c0: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
55d0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
55e0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
55f0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
5600: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
5610: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
5620: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
5630: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
5640: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5650: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5660: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5670: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5680: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
5690: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
56a0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
56b0: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
56c0: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
56d0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
56e0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
56f0: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5700: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
5710: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5720: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
5730: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
5740: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
5750: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
5760: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5770: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5780: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
5790: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
57a0: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
57b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
57c0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
57d0: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
57e0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
57f0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5800: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5810: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
5820: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
5830: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
5840: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
5850: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
5860: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
5870: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
5880: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
5890: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
58a0: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
58b0: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
58c0: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
58d0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
58e0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
58f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5900: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
5910: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
5920: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5930: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41  se->db;..  if( A
5940: 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29  LWAYS(pName2!=0)
5950: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
5960: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  ){.    if( db->i
5970: 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20  nit.busy ) {.   
5980: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5990: 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
59a0: 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a  upt database");.
59b0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
59c0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
59d0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
59e0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
59f0: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
5a00: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
5a10: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
5a20: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
5a30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5a40: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
5a50: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
5a60: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50  Name1);.      pP
5a70: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5a80: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
5a90: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5aa0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
5ab0: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
5ac0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
5ad0: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
5ae0: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
5af0: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
5b00: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
5b10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5b20: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
5b30: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
5b40: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
5b50: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
5b60: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
5b70: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
5b80: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
5b90: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
5ba0: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
5bb0: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
5bc0: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
5bd0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
5be0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
5bf0: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
5c00: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
5c10: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
5c20: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
5c30: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
5c40: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
5c50: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
5c60: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5c70: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5c90: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
5ca0: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
5cb0: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
5cc0: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
5cd0: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
5ce0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
5cf0: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
5d00: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
5d10: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
5d20: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
5d30: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
5d40: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5d50: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
5d60: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
5d70: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
5d80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
5d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
5da0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
5db0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5dc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
5dd0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
5de0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
5df0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
5e00: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
5e10: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
5e20: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
5e30: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
5e40: 26 20 70 2d 3e 61 75 74 6f 49 6e 64 65 78 21 3d  & p->autoIndex!=
5e50: 32 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  2; p=p->pNext){}
5e60: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
5e70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5e80: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
5e90: 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65   pIdx that corre
5ea0: 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a  sponds to table.
5eb0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20  ** column iCol. 
5ec0: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f   Return -1 if no
5ed0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20  t found..*/.i16 
5ee0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
5ef0: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
5f00: 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69  , i16 iCol){.  i
5f10: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5f20: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
5f30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
5f40: 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  iCol==pIdx->aiCo
5f50: 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e  lumn[i] ) return
5f60: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
5f70: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   -1;.}../*.** Be
5f80: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
5f90: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
5fa0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
5fb0: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
5fc0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
5fd0: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
5fe0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
5ff0: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
6000: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
6010: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6020: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
6030: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
6040: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
6050: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
6060: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
6070: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
6080: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
6090: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
60a0: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
60b0: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
60c0: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
60d0: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
60e0: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
60f0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6100: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
6110: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
6120: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
6130: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
6140: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
6150: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
6160: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
6170: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
6180: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6190: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
61a0: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
61b0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
61c0: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
61d0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
61e0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
61f0: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
6200: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
6210: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
6220: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
6230: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
6240: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
6250: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
6260: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6270: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
6280: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
6290: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
62a0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
62b0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
62c0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
62d0: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
62e0: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
62f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6300: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
6310: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
6320: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
6330: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
6340: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6350: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
6360: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
6370: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
6380: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6390: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
63a0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
63b0: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
63c0: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
63d0: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
63e0: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
63f0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6400: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
6410: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
6420: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6430: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
6440: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
6450: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
6460: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
6470: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
6480: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
6490: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
64a0: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
64b0: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
64c0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
64d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
64e0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
64f0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6500: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
6510: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
6520: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
6530: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
6540: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
6550: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6560: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
6570: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
6580: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
6590: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
65a0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
65b0: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
65c0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
65d0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
65e0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
65f0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
6600: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
6610: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
6620: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
6630: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
6640: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
6650: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
6660: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
6670: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
6680: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
6690: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
66a0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
66b0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
66c0: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
66d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
66e0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
66f0: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
6700: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
6710: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
6720: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
6730: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
6740: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
6750: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
6760: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
6770: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
6780: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
6790: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
67a0: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
67b0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
67c0: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
67d0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
67e0: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
67f0: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
6800: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
6810: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
6820: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
6830: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
6840: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6850: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6860: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e   && isTemp && pN
6870: 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62  ame2->n>0 && iDb
6880: 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  !=1 ){.    /* If
6890: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
68a0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
68b0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
68c0: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
68d0: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
68e0: 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70  se name is "temp
68f0: 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20  " anyway.  */.  
6900: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6910: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
6920: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
6930: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
6940: 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ied");.    retur
6950: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d  n;.  }.  if( !OM
6960: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
6970: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a  emp ) iDb = 1;..
6980: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
6990: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
69a0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
69b0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
69c0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
69d0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
69e0: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
69f0: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
6a00: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
6a10: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
6a20: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6a30: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
6a40: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
6a50: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
6a60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6a70: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
6a80: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
6a90: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
6aa0: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
6ab0: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
6ac0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
6ad0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
6ae0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
6af0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
6b00: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
6b10: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
6b20: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
6b30: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6b40: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
6b50: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
6b60: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
6b70: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6b80: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
6b90: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
6ba0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
6bb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6bc0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
6bd0: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
6be0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6bf0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
6c00: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6c10: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
6c20: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6c30: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
6c40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6c50: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
6c60: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
6c70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6c80: 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20   if( !isVirtual 
6c90: 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  && sqlite3AuthCh
6ca0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
6cb0: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
6cc0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
6cd0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6ce0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
6cf0: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
6d00: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
6d10: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
6d20: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
6d30: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
6d40: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
6d50: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
6d60: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
6d70: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
6d80: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
6d90: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
6da0: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
6db0: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
6dc0: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
6dd0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
6de0: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
6df0: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
6e00: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
6e10: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
6e20: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
6e30: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
6e40: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
6e50: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
6e60: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
6e70: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
6e80: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
6e90: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
6ea0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
6eb0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
6ec0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
6ed0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
6ee0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6ef0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6f00: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
6f10: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
6f20: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
6f30: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
6f40: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
6f50: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
6f60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6f70: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
6f80: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
6f90: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
6fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6fb0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
6fc0: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20  it.busy );.     
6fd0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
6fe0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
6ff0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  e, iDb);.      }
7000: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7010: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7020: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
7030: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
7040: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  , zName, zDb)!=0
7050: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7060: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7070: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
7080: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
7090: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
70a0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
70b0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
70c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c    }.  }..  pTabl
70d0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
70e0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
70f0: 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66  of(Table));.  if
7100: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
7110: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
7120: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  led = 1;.    pPa
7130: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
7140: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72  _NOMEM;.    pPar
7150: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
7160: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7170: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54  _error;.  }.  pT
7180: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  able->zName = zN
7190: 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  ame;.  pTable->i
71a0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
71b0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  ble->pSchema = d
71c0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
71d0: 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  ema;.  pTable->n
71e0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c  Ref = 1;.  pTabl
71f0: 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34  e->nRowEst = 104
7200: 38 35 37 36 3b 0a 20 20 61 73 73 65 72 74 28 20  8576;.  assert( 
7210: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7220: 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65  e==0 );.  pParse
7230: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
7240: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  able;..  /* If t
7250: 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63  his is the magic
7260: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
7270: 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61   table used by a
7280: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20  utoincrement,.  
7290: 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61  ** then record a
72a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
72b0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
72c0: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
72d0: 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68  cture.  ** so th
72e0: 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69  at INSERT can fi
72f0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73  nd the table eas
7300: 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ily..  */.#ifnde
7310: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
7320: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66  TOINCREMENT.  if
7330: 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  ( !pParse->neste
7340: 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d  d && strcmp(zNam
7350: 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
7360: 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
7370: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
7380: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
7390: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
73a0: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
73b0: 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61  a->pSeqTab = pTa
73c0: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
73d0: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
73e0: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
73f0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74  that will insert
7400: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
7410: 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  d into.  ** the 
7420: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
7430: 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ble.  Note in pa
7440: 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65  rticular that we
7450: 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20   must go ahead. 
7460: 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65   ** and allocate
7470: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
7480: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
7490: 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66   entry now.  Bef
74a0: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49  ore any.  ** PRI
74b0: 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
74c0: 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  UE keywords are 
74d0: 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b  parsed.  Those k
74e0: 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75  eywords will cau
74f0: 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  se.  ** indices 
7500: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e  to be created an
7510: 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  d the table reco
7520: 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66  rd must come bef
7530: 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  ore the .  ** in
7540: 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74  dices.  Hence, t
7550: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7560: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d   for the table m
7570: 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
7580: 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
7590: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
75a0: 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c  busy && (v = sql
75b0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
75c0: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  se))!=0 ){.    i
75d0: 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66  nt j1;.    int f
75e0: 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69  ileFormat;.    i
75f0: 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72  nt reg1, reg2, r
7600: 65 67 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg3;.    sqlite3
7610: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
7620: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
7630: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
7640: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7650: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69  LTABLE.    if( i
7660: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
7670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7680: 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
7690: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
76a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
76b0: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
76c0: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
76d0: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
76e0: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
76f0: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
7700: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31  .    */.    reg1
7710: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7720: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
7730: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d  nMem;.    reg2 =
7740: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
7750: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7760: 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b  m;.    reg3 = ++
7770: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
7780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7790: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  Op3(v, OP_ReadCo
77a0: 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c  okie, iDb, reg3,
77b0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
77c0: 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  AT);.    sqlite3
77d0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
77e0: 20 69 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20   iDb);.    j1 = 
77f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7800: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33  1(v, OP_If, reg3
7810: 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61  );.    fileForma
7820: 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  t = (db->flags &
7830: 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
7840: 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20  leFmt)!=0 ?.    
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
7860: 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c  : SQLITE_MAX_FIL
7870: 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71  E_FORMAT;.    sq
7880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7890: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66  v, OP_Integer, f
78a0: 69 6c 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29  ileFormat, reg3)
78b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
78c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
78d0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
78e0: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c  REE_FILE_FORMAT,
78f0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7900: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7910: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43   OP_Integer, ENC
7920: 28 64 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20  (db), reg3);.   
7930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7940: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7950: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54  ie, iDb, BTREE_T
7960: 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65  EXT_ENCODING, re
7970: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7980: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
7990: 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  j1);..    /* Thi
79a0: 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61  s just creates a
79b0: 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65   place-holder re
79c0: 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69  cord in the sqli
79d0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
79e0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
79f0: 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20  rd created does 
7a00: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74  not contain anyt
7a10: 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69  hing yet.  It wi
7a20: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20  ll be replaced. 
7a30: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61     ** by the rea
7a40: 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20  l entry in code 
7a50: 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c  generated at sql
7a60: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
7a70: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
7a80: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
7a90: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66  new entry is lef
7aa0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  t in register pP
7ab0: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a  arse->regRowid..
7ac0: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20      ** The root 
7ad0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
7ae0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  he new table is 
7af0: 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72  left in reg pPar
7b00: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
7b10: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e   ** The rowid an
7b20: 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  d root page numb
7b30: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65  er values are ne
7b40: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
7b50: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c   that.    ** sql
7b60: 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c  ite3EndTable wil
7b70: 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  l generate..    
7b80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
7b90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
7ba0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
7bb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7bc0: 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20  LTABLE).    if( 
7bd0: 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74  isView || isVirt
7be0: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
7bf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7c00: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
7c10: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73   reg2);.    }els
7c20: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
7c30: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
7c40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7c50: 64 64 72 28 76 29 20 3c 20 31 30 30 20 29 3b 0a  ddr(v) < 100 );.
7c60: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64        pParse->ad
7c70: 64 72 43 72 54 61 62 20 3d 20 28 75 31 36 29 73  drCrTab = (u16)s
7c80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7c90: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
7ca0: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
7cb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7cc0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
7cd0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
7ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7cf0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
7d00: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
7d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7d20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
7d30: 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   0, reg3);.    s
7d40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7d50: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
7d60: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
7d70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7d80: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7d90: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
7da0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7db0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
7dc0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
7dd0: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
7de0: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
7df0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
7e00: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
7e10: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
7e20: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
7e30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7e40: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
7e50: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
7e60: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
7e70: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
7e80: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
7e90: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
7ea0: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
7eb0: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
7ec0: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
7ed0: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
7ee0: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
7ef0: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
7f00: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
7f10: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
7f20: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
7f30: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
7f40: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
7f50: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
7f60: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
7f70: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
7f80: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
7f90: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
7fa0: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
7fb0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
7fc0: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
7fd0: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
7fe0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
7ff0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
8000: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
8010: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
8020: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
8030: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
8040: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
8050: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
8060: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
8070: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
8080: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
8090: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
80a0: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
80b0: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
80c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
80d0: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
80e0: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
80f0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
8100: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
8110: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
8120: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
8130: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
8140: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8150: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
8160: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8170: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
8180: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
8190: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
81a0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
81b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
81c0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
81d0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
81e0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
81f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
8200: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
8210: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
8220: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
8230: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
8240: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8250: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8260: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8270: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8280: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8290: 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  f.  z = sqlite3N
82a0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
82b0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
82c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
82d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
82e0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
82f0: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
8300: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
8310: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8320: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8330: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
8340: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
8350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8360: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8370: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8380: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
8390: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
83a0: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
83b0: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
83c0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
83d0: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
83e0: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
83f0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
8400: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
8410: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8420: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
8430: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8440: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
8450: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
8460: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
8470: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
8480: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
8490: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
84a0: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
84b0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
84c0: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
84d0: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
84e0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
84f0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
8500: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
8510: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
8520: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
8530: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
8540: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
8550: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
8560: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
8570: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
8580: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8590: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
85a0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b  pCol->szEst = 1;
85b0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
85c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
85d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
85e0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
85f0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8600: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8610: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8620: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
8630: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
8640: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
8650: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
8660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
8670: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
8680: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
8690: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
86a0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
86b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
86c0: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
86d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
86e0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
86f0: 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   *p;.  p = pPars
8700: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8710: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
8720: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
8730: 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  eturn;.  p->aCol
8740: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e  [p->nCol-1].notN
8750: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
8760: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
8770: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
8780: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
8790: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
87a0: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
87b0: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
87c0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
87d0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
87e0: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
87f0: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
8800: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
8810: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
8820: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
8830: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
8840: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
8850: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
8860: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
8870: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
8880: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
8890: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
88a0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
88b0: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
88c0: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
88d0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
88e0: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
88f0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
8900: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
8910: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
8920: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
8930: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
8940: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
8950: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
8980: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8990: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
89a0: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
89b0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
89c0: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
89d0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
89e0: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
89f0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8a00: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
8a10: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8a20: 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41  AFF_NONE.** 'REA
8a30: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
8a40: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
8a50: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
8a60: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
8a70: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
8a80: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8a90: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
8aa0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
8ab0: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
8ac0: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
8ad0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
8ae0: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
8af0: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
8b00: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
8b10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
8b20: 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75  u8 *pszEst){.  u
8b30: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
8b40: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8b50: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
8b60: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
8b70: 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d   0;..  if( zIn==
8b80: 30 20 29 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  0 ) return aff;.
8b90: 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20    while( zIn[0] 
8ba0: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
8bb0: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
8bc0: 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30  ToLower[(*zIn)&0
8bd0: 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  xff];.    zIn++;
8be0: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
8bf0: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
8c00: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
8c10: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
8c20: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
8c30: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8c40: 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61  TEXT;.      zCha
8c50: 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c  r = zIn;.    }el
8c60: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
8c70: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8c80: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
8c90: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
8ca0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8cb0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
8cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8cd0: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
8ce0: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
8cf0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
8d00: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
8d10: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
8d20: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
8d30: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
8d40: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
8d50: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8d60: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
8d70: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
8d80: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
8d90: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
8da0: 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20  F_REAL) ){.     
8db0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8dc0: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 69 66  F_NONE;.      if
8dd0: 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20  ( zIn[0]=='(' ) 
8de0: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66  zChar = zIn;.#if
8df0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8e00: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
8e10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8e20: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
8e30: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
8e40: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
8e50: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
8e60: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
8e70: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
8e80: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8e90: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
8ea0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
8eb0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
8ec0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
8ed0: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
8ee0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
8ef0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
8f00: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
8f10: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8f20: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
8f30: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
8f40: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
8f50: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
8f60: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
8f70: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
8f80: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8f90: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
8fa0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
8fb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
8fc0: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
8fd0: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
8fe0: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
8ff0: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
9000: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9010: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
9020: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9030: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
9040: 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c  szEst is not NUL
9050: 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69  L, store an esti
9060: 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c  mate of the fiel
9070: 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a  d size.  The.  *
9080: 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63  * estimate is sc
9090: 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  aled so that the
90a0: 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65   size of an inte
90b0: 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20  ger is 1.  */.  
90c0: 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20  if( pszEst ){.  
90d0: 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20    *pszEst = 1;  
90e0: 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65   /* default size
90f0: 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74   is approx 4 byt
9100: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66  es */.    if( af
9110: 66 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f<=SQLITE_AFF_NO
9120: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NE ){.      if( 
9130: 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20  zChar ){.       
9140: 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d   while( zChar[0]
9150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
9160: 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  ( sqlite3Isdigit
9170: 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20  (zChar[0]) ){.  
9180: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 20            int v 
9190: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
91a0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
91b0: 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20  (zChar, &v);.   
91c0: 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34           v = v/4
91d0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   + 1;.          
91e0: 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20    if( v>255 ) v 
91f0: 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20  = 255;.         
9200: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20     *pszEst = v; 
9210: 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43  /* BLOB(k), VARC
9220: 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20  HAR(k), CHAR(k) 
9230: 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a  -> r=(k/4+1) */.
9240: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9250: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
9260: 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b           zChar++
9270: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9290: 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20   *pszEst = 5;   
92a0: 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43  /* BLOB, TEXT, C
92b0: 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70  LOB -> r=5  (app
92c0: 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a  rox 20 bytes)*/.
92d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
92e0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
92f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9300: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9310: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9320: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9330: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
9340: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9350: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
9360: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
9370: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
9380: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
9390: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
93a0: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
93b0: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
93c0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
93d0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
93e0: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
93f0: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
9400: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
9410: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
9420: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
9430: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
9440: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
9450: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
9460: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
9470: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
9480: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
9490: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
94a0: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
94b0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
94c0: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
94d0: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
94e0: 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65  l;..  p = pParse
94f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
9500: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
9510: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
9520: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
9530: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
9540: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
9550: 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a  ol->zType==0 );.
9560: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
9570: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
9580: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
9590: 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d   pType);.  pCol-
95a0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
95b0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
95c0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43  pCol->zType, &pC
95d0: 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f  ol->szEst);.}../
95e0: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
95f0: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9600: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
9610: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
9620: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
9630: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
9640: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9650: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
9660: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9670: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9680: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9690: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
96a0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
96b0: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
96c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
96d0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
96e0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
96f0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9700: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9710: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9720: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9730: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
9740: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9750: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
9760: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9770: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9780: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9790: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
97a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
97b0: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
97c0: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
97d0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
97e0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
97f0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9800: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
9810: 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20 20  an->pExpr) ){.  
9820: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9830: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
9840: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
9850: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
9860: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
9870: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
9880: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9890: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
98a0: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
98b0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
98c0: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
98d0: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
98e0: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
98f0: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
9900: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
9910: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
9920: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
9930: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
9940: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
9950: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9960: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9970: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
9980: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
9990: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
99a0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61  ExprDup(db, pSpa
99b0: 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55  n->pExpr, EXPRDU
99c0: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
99d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
99e0: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
99f0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66  .      pCol->zDf
9a00: 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  lt = sqlite3DbSt
9a10: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
9a20: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a50: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
9a60: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
9a70: 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a  zStart));.    }.
9a80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
9a90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61  rDelete(db, pSpa
9aa0: 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  n->pExpr);.}../*
9ab0: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
9ac0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
9ad0: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
9ae0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
9af0: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
9b00: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
9b10: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
9b20: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
9b30: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
9b40: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9b50: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
9b60: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
9b70: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
9b80: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
9b90: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
9ba0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
9bb0: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
9bc0: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
9bd0: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
9be0: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
9bf0: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
9c00: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
9c10: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
9c20: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
9c30: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
9c40: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
9c50: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
9c60: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
9c70: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
9c80: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
9c90: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
9ca0: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
9cb0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
9cc0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9cd0: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
9ce0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
9cf0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
9d00: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
9d10: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
9d20: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
9d30: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
9d40: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
9d50: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
9d60: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
9d70: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
9d80: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
9d90: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
9da0: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
9db0: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
9dc0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9dd0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
9de0: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
9df0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9e00: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
9e10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9e20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
9e30: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
9e40: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
9e50: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
9e60: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
9e70: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
9e80: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
9e90: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
9ea0: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
9eb0: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
9ec0: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
9ed0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
9ee0: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
9ef0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
9f00: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
9f10: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
9f20: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
9f30: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
9f40: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
9f50: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
9f60: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , i;.  int nTerm
9f70: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
9f80: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
9f90: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
9fa0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
9fb0: 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
9fc0: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
9fd0: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
9fe0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9ff0: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
a000: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
a010: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
a020: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
a030: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
a040: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a050: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62  .  }.  pTab->tab
a060: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50  Flags |= TF_HasP
a070: 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28  rimaryKey;.  if(
a080: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
a090: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
a0a0: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
a0b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c  ->aCol[iCol].col
a0c0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a0d0: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a 54  _PRIMKEY;.    zT
a0e0: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
a0f0: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
a100: 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d    nTerm = 1;.  }
a110: 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20  else{.    nTerm 
a120: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
a130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a140: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
a150: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
a160: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
a170: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
a180: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
a190: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
a1a0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
a1b0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
a1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
a1d0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
a1e0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a1f0: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a200: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a210: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a220: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a250: 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d   }.  if( nTerm==
a260: 31 0a 20 20 20 26 26 20 7a 54 79 70 65 20 26 26  1.   && zType &&
a270: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a280: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
a290: 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f  )==0.   && sortO
a2a0: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
a2b0: 41 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  ASC.  ){.    pTa
a2c0: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
a2d0: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
a2e0: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
a2f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
a300: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
a310: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
a320: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
a330: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
a340: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66  ncrement;.    if
a350: 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65  ( pList ) pParse
a360: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d  ->iPkSortOrder =
a370: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
a380: 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20  tOrder;.  }else 
a390: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
a3a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a3b0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
a3c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a3d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
a3e0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
a3f0: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
a400: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
a410: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
a420: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
a430: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  e{.    Index *p;
a440: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
a450: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
a460: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
a470: 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a  st, onError, 0,.
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f             0, so
a4a0: 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20  rtOrder, 0);.   
a4b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
a4c0: 70 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 32  p->autoIndex = 2
a4d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
a4e0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
a4f0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
a500: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a510: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
a520: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
a530: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rn;.}../*.** Add
a540: 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e   a new CHECK con
a550: 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74  straint to the t
a560: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
a570: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a580: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
a590: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
a5a0: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
a5b0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
a5c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a5d0: 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78    Expr *pCheckEx
a5e0: 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b  pr  /* The check
a5f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
a600: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
a610: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61  _OMIT_CHECK.  Ta
a620: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
a630: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a640: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
a650: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
a660: 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63  .    pTab->pChec
a670: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
a680: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
a690: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
a6a0: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20  pCheckExpr);.   
a6b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e   if( pParse->con
a6c0: 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b  straintName.n ){
a6d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
a6e0: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
a6f0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
a700: 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e  ck, &pParse->con
a710: 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b  straintName, 1);
a720: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
a730: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
a740: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a750: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65  pParse->db, pChe
a760: 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ckExpr);.  }.}..
a770: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
a780: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
a790: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
a7a0: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
a7b0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
a7c0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
a7d0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
a7e0: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
a7f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a800: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
a810: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
a820: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t i;.  char *zCo
a830: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
a840: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d   /* Dequoted nam
a850: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  e of collation s
a860: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c  equence */.  sql
a870: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
a880: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
a890: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
a8a0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
a8b0: 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50  Col-1;.  db = pP
a8c0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
a8d0: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
a8e0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
a8f0: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
a900: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
a910: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
a920: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
a930: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49   zColl) ){.    I
a940: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
a950: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a960: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  , p->aCol[i].zCo
a970: 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  ll);.    p->aCol
a980: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
a990: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
a9a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
a9b0: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
a9c0: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
a9d0: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
a9e0: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
a9f0: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
aa00: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
aa10: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
aa20: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
aa30: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
aa40: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
aa50: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
aa60: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
aa70: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
aa80: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
aa90: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
aaa0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
aab0: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20  >nKeyCol==1 );. 
aac0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
aad0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
aae0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
aaf0: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
ab00: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
ab10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
ab20: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
ab30: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
ab40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
ab50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
ab60: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
ab70: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
ab80: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
ab90: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
aba0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
abb0: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
abc0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
abd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
abe0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
abf0: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
ac00: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
ac10: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
ac20: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
ac30: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
ac40: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
ac50: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
ac60: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
ac70: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
ac80: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
ac90: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
aca0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
acb0: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
acc0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
acd0: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
ace0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
acf0: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
ad00: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
ad10: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
ad20: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
ad30: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
ad40: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
ad50: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
ad60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
ad70: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
ad80: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
ad90: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
ada0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
adb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
adc0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
add0: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
ade0: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
adf0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
ae00: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
ae10: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
ae20: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
ae30: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
ae40: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
ae50: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
ae60: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
ae70: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
ae80: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
ae90: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
aea0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
aeb0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
aec0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
aed0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
aee0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
aef0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
af00: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
af10: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
af20: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
af30: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
af40: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
af50: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
af60: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
af70: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
af80: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
af90: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
afa0: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
afb0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
afc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
afd0: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
afe0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
aff0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
b000: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b010: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
b020: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
b030: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
b040: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
b050: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
b060: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
b070: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
b080: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
b090: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
b0a0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
b0b0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
b0c0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
b0d0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
b0e0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
b0f0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
b100: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
b110: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
b120: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
b130: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
b140: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
b150: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
b160: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
b170: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
b180: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
b190: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
b1a0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
b1b0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
b1c0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
b1d0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
b1e0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
b1f0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
b200: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
b210: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
b220: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
b230: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
b240: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
b250: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
b260: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
b270: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
b280: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
b290: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
b2a0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
b2b0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
b2c0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
b2d0: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
b2e0: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
b2f0: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
b300: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
b310: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
b320: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
b330: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b340: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
b350: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
b360: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
b370: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
b380: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73  , iDb, 0) );.  s
b390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b3a0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b3b0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
b3c0: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
b3d0: 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71  kie+1, r1);.  sq
b3e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b3f0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
b400: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
b410: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b  MA_VERSION, r1);
b420: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
b430: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b440: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   r1);.}../*.** M
b450: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
b460: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
b470: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
b480: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
b490: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
b4a0: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
b4b0: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
b4c0: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
b4d0: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
b4e0: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
b4f0: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
b500: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
b510: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
b520: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
b530: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
b540: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
b550: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
b560: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
b570: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
b580: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
b590: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
b5a0: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
b5b0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b5c0: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
b5d0: 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
b5e0: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
b5f0: 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75   to an output bu
b600: 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  ffer. The second
b610: 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69   .** parameter i
b620: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
b630: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63  n integer that c
b640: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73  ontains the offs
b650: 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74  et at.** which t
b660: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
b670: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
b680: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
b690: 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d  pies the.** nul-
b6a0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
b6b0: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
b6c0: 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65  the third parame
b6d0: 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e  ter, zSignedIden
b6e0: 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65  t,.** to the spe
b6f0: 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e  cified offset in
b700: 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20   the buffer and 
b710: 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f  updates *pIdx to
b720: 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65   refer.** to the
b730: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
b740: 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  r the last byte 
b750: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72  written before r
b760: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a  eturning..** .**
b770: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a   If the string z
b780: 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73  SignedIdent cons
b790: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
b7a0: 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a   alpha-numeric.*
b7b0: 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f  * characters, do
b7c0: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
b7d0: 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73  h a digit and is
b7e0: 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77   not an SQL keyw
b7f0: 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ord,.** then it 
b800: 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
b810: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65   output buffer e
b820: 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e  xactly as it is.
b830: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69   Otherwise,.** i
b840: 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e  t is quoted usin
b850: 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e  g double-quotes.
b860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b870: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
b880: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
b890: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
b8a0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
b8b0: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
b8c0: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
b8d0: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
b8e0: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
b8f0: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20  .  i = *pIdx;.. 
b900: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
b910: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
b920: 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e  f( !sqlite3Isaln
b930: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
b940: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
b950: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
b960: 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74  eedQuote = sqlit
b970: 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74  e3Isdigit(zIdent
b980: 5b 30 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b  [0]) || sqlite3K
b990: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
b9a0: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20  t, j)!=TK_ID;.  
b9b0: 69 66 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29  if( !needQuote )
b9c0: 7b 0a 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20  {.    needQuote 
b9d0: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d  = zIdent[j];.  }
b9e0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
b9f0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
ba00: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
ba10: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
ba20: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
ba30: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
ba40: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
ba50: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
ba60: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
ba70: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
ba80: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
ba90: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
baa0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
bab0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
bac0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
bad0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
bae0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
baf0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
bb00: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
bb10: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
bb20: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
bb30: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
bb40: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
bb50: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
bb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
bb70: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
bb80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
bb90: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
bba0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
bbb0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
bbc0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
bbd0: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
bbe0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
bbf0: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
bc00: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
bc10: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
bc20: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
bc30: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
bc40: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
bc50: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
bc60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
bc70: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
bc80: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
bc90: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
bca0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
bcb0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
bcc0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
bcd0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
bce0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
bcf0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
bd00: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
bd10: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
bd20: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
bd30: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
bd40: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
bd50: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
bd60: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
bd70: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
bd80: 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41  Stmt, "CREATE TA
bd90: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71  BLE ");.  k = sq
bda0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
bdb0: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
bdc0: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
bdd0: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
bde0: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
bdf0: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
be00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
be10: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
be20: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
be30: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70  ar * const azTyp
be40: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
be50: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
be60: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
be70: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
be80: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20  ITE_AFF_NONE    
be90: 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f  */ "",.        /
bea0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
beb0: 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a  ERIC */ " NUM",.
bec0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
bed0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f  E_AFF_INTEGER */
bee0: 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20   " INT",.       
bef0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52   /* SQLITE_AFF_R
bf00: 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c  EAL    */ " REAL
bf10: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
bf20: 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20   len;.    const 
bf30: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20  char *zType;..  
bf40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
bf50: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
bf60: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
bf70: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
bf80: 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  30(&zStmt[k]);. 
bf90: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
bfa0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
bfb0: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
bfc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Name);.    asser
bfd0: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
bfe0: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  y-SQLITE_AFF_TEX
bff0: 54 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  T >= 0 );.    as
c000: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
c010: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
c020: 54 45 58 54 20 3c 20 41 72 72 61 79 53 69 7a 65  TEXT < ArraySize
c030: 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20  (azType) );.    
c040: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c050: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c060: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
c070: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c080: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c090: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20  E_AFF_NONE );.  
c0a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
c0b0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
c0c0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
c0d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c0e0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c0f0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c100: 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ER );.    testca
c110: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c120: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
c130: 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20  EAL );.    .    
c140: 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70  zType = azType[p
c150: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20  Col->affinity - 
c160: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 5d  SQLITE_AFF_TEXT]
c170: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  ;.    len = sqli
c180: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
c190: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
c1a0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c1b0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
c1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c1d0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c1e0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
c1f0: 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b  ype(zType, 0) );
c200: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74  .    memcpy(&zSt
c210: 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65  mt[k], zType, le
c220: 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e  n);.    k += len
c230: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c  ;.    assert( k<
c240: 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  =n );.  }.  sqli
c250: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
c260: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73  , &zStmt[k], "%s
c270: 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ", zEnd);.  retu
c280: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
c290: 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64  ** Resize an Ind
c2a0: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c  ex object to hol
c2b0: 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61  d N columns tota
c2c0: 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  l.  Return SQLIT
c2d0: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
c2e0: 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f  ss and SQLITE_NO
c2f0: 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72  MEM on an OOM er
c300: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
c310: 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  nt resizeIndexOb
c320: 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
c330: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
c340: 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a  nt N){.  char *z
c350: 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79  Extra;.  int nBy
c360: 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  te;.  if( pIdx->
c370: 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74  nColumn>=N ) ret
c380: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
c390: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
c3a0: 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20  sResized==0 );. 
c3b0: 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66   nByte = (sizeof
c3c0: 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66  (char*) + sizeof
c3d0: 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20  (i16) + 1)*N;.  
c3e0: 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  zExtra = sqlite3
c3f0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c400: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a   nByte);.  if( z
c410: 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72  Extra==0 ) retur
c420: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
c430: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
c440: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73   pIdx->azColl, s
c450: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64  izeof(char*)*pId
c460: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
c470: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
c480: 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20  har**)zExtra;.  
c490: 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  zExtra += sizeof
c4a0: 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d  (char*)*N;.  mem
c4b0: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
c4c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65  ->aiColumn, size
c4d0: 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43  of(i16)*pIdx->nC
c4e0: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
c4f0: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
c500: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
c510: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
c520: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
c530: 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74  tra, pIdx->aSort
c540: 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f  Order, pIdx->nCo
c550: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
c560: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
c570: 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d  )zExtra;.  pIdx-
c580: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20  >nColumn = N;.  
c590: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20  pIdx->isResized 
c5a0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
c5b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c5c0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74  * Estimate the t
c5d0: 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66  otal row width f
c5e0: 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  or a table..*/.s
c5f0: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
c600: 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61  ateTableWidth(Ta
c610: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e  ble *pTab){.  un
c620: 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20  signed wTable = 
c630: 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  0;.  const Colum
c640: 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e  n *pTabCol;.  in
c650: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61  t i;.  for(i=pTa
c660: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c  b->nCol, pTabCol
c670: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30  =pTab->aCol; i>0
c680: 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; i--, pTabCol++
c690: 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d  ){.    wTable +=
c6a0: 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b   pTabCol->szEst;
c6b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
c6c0: 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c  >iPKey<0 ) wTabl
c6d0: 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54  e++;.  pTab->szT
c6e0: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
c6f0: 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b  ogEst(wTable*4);
c700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
c710: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73  te the average s
c720: 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72  ize of a row for
c730: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74   an index..*/.st
c740: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
c750: 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64  teIndexWidth(Ind
c760: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
c770: 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30  igned wIndex = 0
c780: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
c790: 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  st Column *aCol 
c7a0: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
c7b0: 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aCol;.  for(i=0;
c7c0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
c7d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20  ; i++){.    i16 
c7e0: 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
c7f0: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[i];.    asser
c800: 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c  t( x<pIdx->pTabl
c810: 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77  e->nCol );.    w
c820: 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31  Index += x<0 ? 1
c830: 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69   : aCol[pIdx->ai
c840: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74  Column[i]].szEst
c850: 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a  ;.  }.  pIdx->sz
c860: 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  IdxRow = sqlite3
c870: 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29  LogEst(wIndex*4)
c880: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
c890: 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69  rue if value x i
c8a0: 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74  s found any of t
c8b0: 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e  he first nCol en
c8c0: 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d  tries of aiCol[]
c8d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
c8e0: 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69  asColumn(const i
c8f0: 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e  16 *aiCol, int n
c900: 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77  Col, int x){.  w
c910: 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30  hile( nCol-- > 0
c920: 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f   ) if( x==*(aiCo
c930: 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b  l++) ) return 1;
c940: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c950: 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
c960: 70 54 61 62 20 68 61 73 20 61 20 57 49 54 48 4f  pTab has a WITHO
c970: 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65 20  UT ROWID clause 
c980: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 47 6f 20  at the end.  Go 
c990: 74 68 72 6f 75 67 68 20 61 6e 64 0a 2a 2a 20 6d  through and.** m
c9a0: 61 6b 65 20 61 6c 6c 20 74 68 65 20 63 68 61 6e  ake all the chan
c9b0: 67 65 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ges necessary to
c9c0: 20 6d 61 6b 65 20 74 68 69 73 20 61 20 57 49 54   make this a WIT
c9d0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
c9e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  ..**.**     (1) 
c9f0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f   Convert the OP_
ca00: 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f  CreateTable into
ca10: 20 61 6e 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 20 20   an no-op..**   
ca20: 20 20 28 32 29 20 20 4d 61 6b 65 20 73 75 72 65    (2)  Make sure
ca30: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
ca40: 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 74  ns are part of t
ca50: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 2a  he PRIMARY KEY.*
ca60: 2a 20 20 20 20 20 28 33 29 20 20 4d 61 6b 65 20  *     (3)  Make 
ca70: 73 75 72 65 20 61 6c 6c 20 50 52 49 4d 41 52 59  sure all PRIMARY
ca80: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 61 72 65   KEY columns are
ca90: 20 70 61 72 74 20 6f 66 20 61 6c 6c 20 55 4e 49   part of all UNI
caa0: 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  QUE.**          
cab0: 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69  indices.*/.stati
cac0: 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f  c void convertTo
cad0: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
cae0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
caf0: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
cb00: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
cb10: 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e  Index *pPk;.  in
cb20: 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20  t nPk;.  int i, 
cb30: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
cb40: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
cb50: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
cb60: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
cb70: 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  opcode that woul
cb80: 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74  d normally creat
cb90: 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d  e the.  ** root-
cba0: 70 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62  page for the tab
cbb0: 6c 65 20 69 6e 74 6f 20 61 20 4f 50 5f 4e 75 6c  le into a OP_Nul
cbc0: 6c 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  l opcode.  This 
cbd0: 70 72 65 76 65 6e 74 73 20 74 68 65 0a 20 20 2a  prevents the.  *
cbe0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  * allocation of 
cbf0: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 77  the root-page (w
cc00: 68 69 63 68 20 77 6f 75 6c 64 20 6e 65 76 65 72  hich would never
cc10: 20 62 65 65 6e 20 75 73 65 64 2c 20 61 73 20 61   been used, as a
cc20: 6c 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  ll.  ** content 
cc30: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
cc40: 20 70 72 69 6d 61 72 79 2d 6b 65 79 20 69 6e 64   primary-key ind
cc50: 65 78 20 69 6e 73 74 65 61 64 29 20 61 6e 64 20  ex instead) and 
cc60: 69 74 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 61  it causes.  ** a
cc70: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 74   NULL value in t
cc80: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
cc90: 2e 72 6f 6f 74 70 61 67 65 20 66 69 65 6c 64 20  .rootpage field 
cca0: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 0a 20  of the schema.. 
ccb0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
ccc0: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
ccd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65     sqlite3VdbeGe
cce0: 74 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62  tOp(pParse->pVdb
ccf0: 65 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  e, pParse->addrC
cd00: 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20 3d 20  rTab)->opcode = 
cd10: 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a 20 20  OP_Null;.  }..  
cd20: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52  /* Locate the PR
cd30: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
cd40: 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61    Or, if this ta
cd50: 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ble was original
cd60: 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47  ly.  ** an INTEG
cd70: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
cd80: 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e  able, create a n
cd90: 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ew PRIMARY KEY i
cda0: 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ndex. .  */.  if
cdb0: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
cdc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
cdd0: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69   *pList;.    pLi
cde0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
cdf0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
ce00: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
ce10: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
ce20: 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  urn;.    pList->
ce30: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[0].zName = sql
ce40: 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
ce50: 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
ce90: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
cea0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
ceb0: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61  .sortOrder = pPa
cec0: 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65  rse->iPkSortOrde
ced0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
cee0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
cef0: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 70 50  ==pTab );.    pP
cf00: 6b 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  k = sqlite3Creat
cf10: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
cf20: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70  , 0, 0, pList, p
cf30: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c  Tab->keyConf, 0,
cf40: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
cf50: 66 28 20 70 50 6b 3d 3d 30 20 29 20 72 65 74 75  f( pPk==0 ) retu
cf60: 72 6e 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  rn;.    pTab->iP
cf70: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  Key = -1;.  }els
cf80: 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  e{.    pPk = sql
cf90: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
cfa0: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20  dex(pTab);.  }. 
cfb0: 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20   assert( pPk!=0 
cfc0: 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e  );.  nPk = pPk->
cfd0: 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d  nKeyCol;..  /* M
cfe0: 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 63  ake sure every c
cff0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50 52 49  olumn of the PRI
d000: 4d 41 52 59 20 4b 45 59 20 69 73 20 4e 4f 54 20  MARY KEY is NOT 
d010: 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  NULL */.  for(i=
d020: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
d030: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
d040: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Pk->aiColumn[i]]
d050: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  .notNull = 1;.  
d060: 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
d070: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
d080: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
d090: 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65  ll UNIQUE indice
d0a0: 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  s by converting.
d0b0: 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72    ** the final r
d0c0: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  owid column into
d0d0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   one or more col
d0e0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
d0f0: 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  ARY KEY..  */.  
d100: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
d110: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d120: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
d130: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
d140: 66 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  f( pIdx->autoInd
d150: 65 78 3d 3d 32 20 29 20 63 6f 6e 74 69 6e 75 65  ex==2 ) continue
d160: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
d170: 6e 4b 65 79 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e  nKeyCol==pTab->n
d180: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 64  Col ){.      pId
d190: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  x->nColumn = pTa
d1a0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 63  b->nCol;.      c
d1b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
d1c0: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c     for(i=n=0; i<
d1d0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
d1e0: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
d1f0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
d200: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
d210: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
d220: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
d230: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
d240: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
d250: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
d260: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
d270: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
d280: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
d290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d2a0: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
d2b0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  x->aiColumn, j, 
d2c0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
d2d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
d2e0: 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c  ert( j<pPk->nCol
d2f0: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
d300: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
d310: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
d320: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64  [i];.        pId
d330: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70  x->azColl[j] = p
d340: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  Pk->azColl[i];. 
d350: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
d360: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
d370: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
d380: 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73  umn==j );.    as
d390: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
d3a0: 43 6f 6c 2b 6e 3d 3d 6a 20 29 3b 0a 20 20 7d 0a  Col+n==j );.  }.
d3b0: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61  .  /* Add all ta
d3c0: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  ble columns to t
d3d0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
d3e0: 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ndex.  */.  if( 
d3f0: 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  nPk<pTab->nCol )
d400: 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  {.    if( resize
d410: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
d420: 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  pPk, pTab->nCol)
d430: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
d440: 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69  or(i=0, j=nPk; i
d450: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
d460: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
d470: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
d480: 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a  olumn, j, i) ){.
d490: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d4a0: 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  j<pPk->nColumn )
d4b0: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
d4c0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a  iColumn[j] = i;.
d4d0: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43          pPk->azC
d4e0: 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52 59  oll[j] = "BINARY
d4f0: 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  ";.        j++;.
d500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d510: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e    assert( pPk->n
d520: 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20  Column==j );.   
d530: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
d540: 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 0a 7d 0a  Col==j );.  }.}.
d550: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d560: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
d570: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
d580: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
d590: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
d5a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
d5b0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
d5c0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
d5d0: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
d5e0: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
d5f0: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
d600: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
d610: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
d620: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
d630: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
d640: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
d650: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
d660: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
d670: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
d680: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
d690: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
d6a0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
d6b0: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
d6c0: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
d6d0: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
d6e0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
d6f0: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
d700: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
d710: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
d720: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
d730: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
d740: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
d750: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
d760: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
d770: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
d780: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
d790: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
d7a0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
d7b0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
d7c0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
d7d0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
d7e0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
d7f0: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
d800: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
d810: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
d820: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
d830: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
d840: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
d850: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
d860: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
d870: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
d880: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
d890: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
d8a0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
d8b0: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
d8c0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d8d0: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
d8e0: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
d8f0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
d900: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d910: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
d920: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
d930: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
d940: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
d950: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
d960: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
d970: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
d980: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27        /* The ')'
d990: 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20   before options 
d9a0: 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
d9b0: 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f  BLE */.  u8 tabO
d9c0: 70 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  pts,            
d9d0: 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20   /* Extra table 
d9e0: 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79  options. Usually
d9f0: 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   0. */.  Select 
da00: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
da10: 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20   /* Select from 
da20: 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53  a "CREATE ... AS
da30: 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20   SELECT" */.){. 
da40: 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20   Table *p;      
da50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
da60: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
da70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
da80: 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68  Parse->db; /* Th
da90: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
daa0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
dab0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
dac0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
dad0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61   in which the ta
dae0: 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49  ble lives */.  I
daf0: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
db00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
db10: 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20  mplied index of 
db20: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  the table */..  
db30: 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20  if( (pEnd==0 && 
db40: 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64  pSelect==0) || d
db50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
db60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
db70: 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d   }.  p = pParse-
db80: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
db90: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
dba0: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
dbb0: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
dbc0: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 66 28  Select );..  if(
dbd0: 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69   tabOpts & TF_Wi
dbe0: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20  thoutRowid ){.  
dbf0: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
dc00: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
dc10: 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ryKey)==0 ){.   
dc20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
dc30: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 50  sg(pParse, "no P
dc40: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
dc50: 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
dc60: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
dc70: 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67        p->tabFlag
dc80: 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52  s |= TF_WithoutR
dc90: 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76  owid;.      conv
dca0: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
dcb0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  dTable(pParse, p
dcc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
dcd0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
dce0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
dcf0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
dd00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dd10: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
dd20: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
dd30: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
dd40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
dd50: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
dd60: 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eck ){.    sqlit
dd70: 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
dd80: 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
dd90: 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c  , NC_IsCheck, 0,
dda0: 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d   p->pCheck);.  }
ddb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
ddc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ddd0: 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
dde0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
ddf0: 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f  rage row size fo
de00: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
de10: 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20  for all implied 
de20: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74  indices */.  est
de30: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
de40: 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  p);.  for(pIdx=p
de50: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
de60: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
de70: 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49  ){.    estimateI
de80: 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b  ndexWidth(pIdx);
de90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
dea0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
deb0: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
dec0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
ded0: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
dee0: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
def0: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
df00: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
df10: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
df20: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
df30: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
df40: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
df50: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
df60: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
df70: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
df80: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
df90: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
dfa0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
dfb0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
dfc0: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
dfd0: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
dfe0: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
dff0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
e000: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
e010: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
e020: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
e030: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
e040: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
e050: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
e060: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
e070: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
e080: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
e090: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20  database..  **. 
e0a0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
e0b0: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
e0c0: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
e0d0: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
e0e0: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
e0f0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
e100: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e110: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
e120: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
e130: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
e140: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
e150: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
e160: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
e170: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
e180: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
e190: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
e1a0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
e1b0: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
e1c0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
e1d0: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
e1e0: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
e1f0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
e200: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e210: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
e220: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ==0) ) return;..
e230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e240: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
e250: 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a  e, 0);..    /* .
e260: 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a      ** Initializ
e270: 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  e zType for the 
e280: 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c  new view or tabl
e290: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
e2a0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
e2b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
e2c0: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
e2d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
e2e0: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
e2f0: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
e300: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e310: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
e320: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
e330: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
e340: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
e350: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
e360: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
e370: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
e380: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
e390: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
e3a0: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
e3b0: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
e3c0: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
e3d0: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
e3e0: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
e3f0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
e400: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
e410: 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  is in register p
e420: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
e430: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
e440: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
e450: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
e460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
e470: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
e480: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
e490: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
e4a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
e4b0: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
e4c0: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
e4d0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
e4e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68    **.    ** A sh
e4f0: 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65  ared-cache write
e500: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71  -lock is not req
e510: 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74  uired to write t
e520: 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c  o the new table,
e530: 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68  .    ** as a sch
e540: 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61  ema-lock must ha
e550: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
e560: 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61  obtained to crea
e570: 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20  te it. Since.   
e580: 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   ** a schema-loc
e590: 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f  k excludes all o
e5a0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73  ther database us
e5b0: 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c  ers, the write-l
e5c0: 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a  ock would.    **
e5d0: 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20   be redundant.. 
e5e0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
e5f0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53  elect ){.      S
e600: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
e610: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
e620: 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73  lTab;..      ass
e630: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
e640: 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
e650: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e660: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
e670: 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  , pParse->regRoo
e680: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  t, iDb);.      s
e690: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e6a0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49  P5(v, OPFLAG_P2I
e6b0: 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61  SREG);.      pPa
e6c0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
e6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
e6e0: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
e6f0: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b  , SRT_Table, 1);
e700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
e710: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
e720: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
e730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e740: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
e750: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 1);.      if(
e760: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
e770: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
e780: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
e790: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
e7a0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
e7b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
e7c0: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
e7d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e7e0: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
e7f0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
e800: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
e810: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
e820: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
e830: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
e840: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
e850: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
e860: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
e870: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
e880: 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
e890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e8a0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
e8b0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
e8c0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
e8d0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
e8e0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
e8f0: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
e900: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
e910: 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
e920: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e        Token *pEn
e930: 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26  d2 = tabOpts ? &
e940: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
e950: 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20  en : pEnd;.     
e960: 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32   n = (int)(pEnd2
e970: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
e980: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
e990: 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b     if( pEnd2->z[
e9a0: 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70  0]!=';' ) n += p
e9b0: 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a  End2->n;.      z
e9c0: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
e9d0: 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
e9e0: 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20       "CREATE %s 
e9f0: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
ea00: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
ea10: 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a  oken.z.      );.
ea20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
ea30: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
ea40: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
ea50: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
ea60: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
ea70: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
ea80: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
ea90: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
eaa0: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
eab0: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
eac0: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
ead0: 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cted..    */.   
eae0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
eaf0: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
eb00: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
eb10: 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
eb20: 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
eb30: 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
eb40: 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73   rootpage=#%d, s
eb50: 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
eb60: 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22  WHERE rowid=#%d"
eb70: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
eb80: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
eb90: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
eba0: 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
ebb0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
ebc0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
ebd0: 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
ebe0: 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
ebf0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
ec00: 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
ec10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ec20: 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
ec30: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
ec40: 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
ec50: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
ec60: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
ec70: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
ec80: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
ec90: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
eca0: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
ecb0: 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
ecc0: 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
ecd0: 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
ece0: 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
ecf0: 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67    if( p->tabFlag
ed00: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
ed10: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62  ment ){.      Db
ed20: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
ed30: 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
ed40: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
ed50: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
ed60: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
ed70: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
ed80: 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
ed90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eda0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
edb0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
edc0: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
edd0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
ede0: 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
edf0: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
ee00: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
ee10: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
ee20: 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
ee30: 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
ee40: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
ee50: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
ee60: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
ee70: 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
ee80: 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
ee90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
eea0: 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
eeb0: 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
eec0: 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
eed0: 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
eee0: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
eef0: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
ef00: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
ef10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
ef20: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
ef30: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
ef40: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
ef50: 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
ef60: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
ef70: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
ef80: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
ef90: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
efa0: 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
efb0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
efc0: 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
efd0: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
efe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f000: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
f010: 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20  >zName),p);.    
f020: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
f030: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
f040: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
f050: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
f060: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
f070: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62  rt() */.      db
f080: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
f090: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
f0a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
f0b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
f0c0: 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  0;.    db->flags
f0d0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
f0e0: 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
f0f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f100: 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
f110: 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
f120: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
f130: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
f140: 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
f150: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
f160: 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
f170: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f180: 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
f190: 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
f1a0: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
f1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
f1c0: 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
f1d0: 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
f1e0: 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
f1f0: 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
f200: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
f210: 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
f220: 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
f230: 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
f240: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
f250: 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
f260: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f270: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
f280: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
f290: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
f2a0: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
f2b0: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
f2c0: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
f2d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f2e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
f2f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
f300: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
f310: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
f320: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
f330: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
f340: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
f350: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
f360: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
f370: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
f380: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
f390: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
f3a0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
f3b0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
f3c0: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
f3d0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
f3e0: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
f3f0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
f400: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
f410: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
f420: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
f430: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
f440: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
f450: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
f460: 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
f470: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
f480: 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20  if VIEW already 
f490: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
f4a0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
f4b0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
f4c0: 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
f4d0: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
f4e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
f4f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  = 0;.  int iDb;.
f500: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f510: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
f520: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
f530: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f540: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f550: 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
f560: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
f570: 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c  views");.    sql
f580: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
f590: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
f5a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
f5b0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
f5c0: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
f5d0: 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
f5e0: 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
f5f0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
f600: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
f610: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
f620: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
f630: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
f640: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
f650: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
f660: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
f670: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
f680: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
f690: 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
f6a0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
f6b0: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
f6c0: 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
f6d0: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
f6e0: 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
f6f0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
f700: 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
f710: 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  Fix, pSelect) ){
f720: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
f730: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
f740: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
f750: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
f760: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
f770: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
f780: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
f790: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
f7a0: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
f7b0: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
f7c0: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
f7d0: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
f7e0: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
f7f0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
f800: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
f810: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
f820: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
f830: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
f840: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
f850: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
f860: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
f870: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
f880: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
f890: 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
f8a0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
f8b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
f8c0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
f8d0: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  lect);.  if( db-
f8e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f8f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
f900: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
f910: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
f920: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
f930: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
f940: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
f950: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
f960: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
f970: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
f980: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
f990: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
f9a0: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
f9b0: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
f9c0: 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e  if( ALWAYS(sEnd.
f9d0: 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64  z[0]!=0) && sEnd
f9e0: 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
f9f0: 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
fa00: 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
fa10: 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74   = 0;.  n = (int
fa20: 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  )(sEnd.z - pBegi
fa30: 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n->z);.  z = pBe
fa40: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
fa50: 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20   ALWAYS(n>0) && 
fa60: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
fa70: 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
fa80: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
fa90: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
faa0: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
fab0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
fac0: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
fad0: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
fae0: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
faf0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
fb00: 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
fb10: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
fb20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fb30: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
fb40: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
fb50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
fb60: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
fb70: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
fb80: 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
fb90: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
fba0: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
fbb0: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
fbc0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
fbd0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
fbe0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
fbf0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
fc00: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
fc10: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
fc20: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
fc30: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
fc40: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
fc50: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
fc60: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
fc70: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
fc80: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
fc90: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
fca0: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
fcb0: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
fcc0: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
fcd0: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
fce0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
fcf0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
fd00: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
fd10: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
fd20: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
fd30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
fd40: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
fd50: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
fd60: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
fd70: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
fd80: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
fd90: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
fda0: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
fdb0: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
fdc0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
fdd0: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
fde0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
fdf0: 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
fe00: 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f   int (*xAuth)(vo
fe10: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
fe20: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
fe30: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
fe40: 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73  t char*);..  ass
fe50: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
fe60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fe70: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
fe80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
fe90: 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
fea0: 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
feb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fec0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
fed0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
fee0: 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
fef0: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
ff00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ff10: 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
ff20: 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
ff30: 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
ff40: 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
ff50: 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
ff60: 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
ff70: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
ff80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
ff90: 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
ffa0: 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
ffb0: 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
ffc0: 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
ffd0: 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
ffe0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
fff0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
10000 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
10010 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
10020 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
10030 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
10040 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
10050 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
10060 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
10070 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
10080 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
10090 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
100a0 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
100b0 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
100c0 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
100d0 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
100e0 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
100f0 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
10100 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
10110 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
10120 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
10130 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
10140 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
10150 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
10160 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
10170 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
10180 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
10190 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
101a0 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
101b0 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
101c0 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
101d0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
101e0 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
101f0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
10200 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
10210 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10220 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
10230 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
10240 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
10250 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
10260 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
10270 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
10280 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
10290 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
102a0 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
102b0 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
102c0 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
102d0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
102e0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
102f0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
10300 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
10310 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
10320 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
10330 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
10340 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
10350 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
10360 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
10370 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
10380 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
10390 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
103a0 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
103b0 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
103c0 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
103d0 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
103e0 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
103f0 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
10400 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
10410 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
10420 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
10430 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
10440 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
10450 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
10460 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
10470 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
10480 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69  u8 enableLookasi
10490 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  de = db->lookasi
104a0 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20  de.bEnabled;.   
104b0 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
104c0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
104d0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
104e0 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
104f0 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
10500 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
10510 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
10520 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  .bEnabled = 0;.#
10530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10540 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
10550 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
10560 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
10570 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
10580 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
10590 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
105a0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
105b0 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
105c0 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
105d0 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
105e0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
105f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
10600 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  l);.#endif.    d
10610 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
10620 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f  abled = enableLo
10630 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61  okaside;.    pPa
10640 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
10650 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29     if( pSelTab )
10660 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10670 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
10680 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
10690 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
106a0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
106b0 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
106c0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
106d0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
106e0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
106f0 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
10700 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
10710 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
10720 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b);.      assert
10730 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
10740 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
10750 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
10760 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
10770 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73  ->pSchema->flags
10780 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
10790 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ews;.    }else{.
107a0 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
107b0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
107c0 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
107d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
107e0 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20  ete(db, pSel);. 
107f0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45   } else {.    nE
10800 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rr++;.  }.#endif
10810 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10820 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
10830 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
10840 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
10850 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
10860 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
10870 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10880 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
10890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
108a0 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
108b0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
108c0 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
108d0 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
108e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
108f0 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
10900 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
10910 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
10920 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
10930 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
10940 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
10950 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
10960 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
10970 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
10980 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
10990 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
109a0 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
109b0 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
109c0 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
109d0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
109e0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
109f0 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
10a00 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
10a10 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
10a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c  .      sqliteDel
10a30 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
10a40 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
10a50 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  pTab->aCol = 0;.
10a60 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
10a70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
10a80 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
10a90 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
10aa0 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
10ab0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
10ac0 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
10ad0 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
10ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10af0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
10b00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
10b10 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
10b20 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
10b30 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
10b40 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
10b50 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
10b60 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
10b70 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
10b80 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
10b90 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
10ba0 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
10bb0 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
10bc0 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
10bd0 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
10be0 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
10bf0 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
10c00 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
10c10 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
10c20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
10c30 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
10c40 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
10c50 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
10c60 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
10c70 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
10c80 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
10c90 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
10ca0 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
10cb0 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
10cc0 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
10cd0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
10ce0 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
10cf0 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
10d00 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
10d10 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
10d20 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
10d30 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
10d40 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
10d50 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
10d60 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
10d70 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
10d80 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
10d90 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
10da0 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
10db0 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
10dc0 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
10dd0 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
10de0 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
10df0 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
10e00 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
10e10 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
10e20 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
10e30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
10e40 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
10e50 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
10e60 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
10e70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10e80 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
10e90 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73  3RootPageMoved(s
10ea0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
10eb0 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  iDb, int iFrom, 
10ec0 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
10ed0 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
10ee0 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62  ash *pHash;.  Db
10ef0 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
10f00 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
10f10 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
10f20 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  , 0) );.  pDb = 
10f30 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
10f40 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
10f50 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
10f60 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
10f70 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
10f80 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
10f90 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
10fa0 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
10fb0 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
10fc0 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
10fd0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
10fe0 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
10ff0 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
11000 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
11010 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
11020 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
11030 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
11040 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
11050 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
11060 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
11070 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
11080 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
11090 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
110a0 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
110b0 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
110c0 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
110d0 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
110e0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
110f0 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
11100 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
11110 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
11120 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
11130 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
11140 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
11150 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
11160 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
11170 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
11180 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
11190 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
111a0 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
111b0 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
111c0 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
111d0 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
111e0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
111f0 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
11200 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
11210 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
11220 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
11230 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11240 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
11250 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
11260 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
11270 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
11280 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11290 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
112a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
112b0 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
112c0 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b  Table, r1, iDb);
112d0 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  .  sqlite3MayAbo
112e0 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  rt(pParse);.#ifn
112f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11300 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
11310 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65  OP_Destroy store
11320 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20  s an in integer 
11330 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65  r1. If this inte
11340 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d  ger.  ** is non-
11350 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
11360 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
11370 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65  umber of a table
11380 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c   moved to.  ** l
11390 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20  ocation iTable. 
113a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
113b0 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  de modifies the 
113c0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
113d0 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c  ble to.  ** refl
113e0 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20  ect this..  **. 
113f0 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69   ** The "#NNN" i
11400 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73  n the SQL is a s
11410 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20  pecial constant 
11420 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65  that means whate
11430 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  ver value.  ** i
11440 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e  s in register NN
11450 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20  N.  See grammar 
11460 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64  rules associated
11470 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47   with the TK_REG
11480 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e  ISTER.  ** token
11490 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
114a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
114b0 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
114c0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
114d0 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
114e0 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  %s SET rootpage=
114f0 25 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44  %d WHERE #%d AND
11500 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a   rootpage=#%d",.
11510 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
11520 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
11530 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
11540 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  b), iTable, r1, 
11550 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
11560 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11570 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
11590 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
115a0 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
115b0 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
115c0 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
115d0 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
115e0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
115f0 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
11600 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
11610 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
11620 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
11630 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
11640 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
11650 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
11660 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
11670 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
11680 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
11690 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
116a0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
116b0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
116c0 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
116d0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
116e0 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ab){.#ifdef SQLI
116f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11700 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  UM.  Index *pIdx
11710 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  ;.  int iDb = sq
11720 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
11730 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
11740 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
11750 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
11760 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
11770 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72  num, iDb);.  for
11780 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
11790 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
117a0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
117b0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
117c0 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74  (pParse, pIdx->t
117d0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23  num, iDb);.  }.#
117e0 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
117f0 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
11800 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
11810 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
11820 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
11830 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
11840 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
11850 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
11860 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
11870 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
11880 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
11890 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
118a0 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
118b0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
118c0 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
118d0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
118e0 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
118f0 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
11900 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
11910 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
11920 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
11930 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
11940 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
11950 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
11960 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
11970 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
11980 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
11990 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
119a0 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
119b0 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
119c0 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
119d0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
119e0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
119f0 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
11a00 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
11a10 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
11a20 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
11a30 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
11a40 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
11a50 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
11a60 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
11a70 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
11a80 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
11a90 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
11aa0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
11ab0 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
11ac0 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
11ad0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
11ae0 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
11af0 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
11b00 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
11b10 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
11b20 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
11b30 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
11b40 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
11b50 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
11b60 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
11b70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
11b80 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
11b90 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
11ba0 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
11bb0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
11bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
11bd0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
11be0 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
11bf0 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
11c00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
11c10 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
11c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11c30 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
11c40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
11c50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11c60 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
11c70 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
11c80 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
11c90 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
11ca0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
11cb0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
11cc0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
11cd0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
11ce0 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
11cf0 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
11d00 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
11d10 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
11d20 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
11d30 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
11d40 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
11d50 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
11d60 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
11d70 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
11d80 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
11d90 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
11da0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
11db0 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
11dc0 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
11dd0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
11de0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
11df0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
11e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11e10 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
11e20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
11e30 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
11e40 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
11e50 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
11e60 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
11e70 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
11e80 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
11e90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
11ea0 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
11eb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
11ec0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
11ed0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69  for(i=1; i<=4; i
11ee0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  ++){.    char zT
11ef0 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69  ab[24];.    sqli
11f00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
11f10 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22  eof(zTab),zTab,"
11f20 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69  sqlite_stat%d",i
11f30 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
11f40 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
11f50 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44  se->db, zTab, zD
11f60 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  bName) ){.      
11f70 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
11f80 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
11f90 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
11fa0 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25  %Q.%s WHERE %s=%
11fb0 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e  Q",.        zDbN
11fc0 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65  ame, zTab, zType
11fd0 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  , zName.      );
11fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11ff0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
12000 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  e to drop a tabl
12010 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12020 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
12030 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
12040 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20  able *pTab, int 
12050 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29  iDb, int isView)
12060 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  {.  Vdbe *v;.  s
12070 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12080 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67  rse->db;.  Trigg
12090 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
120a0 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
120b0 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20  Db[iDb];..  v = 
120c0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
120d0 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
120e0 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
120f0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
12100 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
12110 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
12120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
12130 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
12140 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
12150 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12160 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
12170 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  Begin);.  }.#end
12180 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
12190 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
121a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
121b0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
121c0 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73  ed. Code.  ** is
121d0 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
121e0 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
121f0 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
12200 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69  and/or.  ** sqli
12210 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
12220 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  f required..  */
12230 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
12240 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
12250 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
12260 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
12270 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  r ){.    assert(
12280 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
12290 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
122a0 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54  a || .        pT
122b0 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
122c0 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
122d0 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ema );.    sqlit
122e0 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
122f0 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
12300 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  r);.    pTrigger
12310 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
12320 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  xt;.  }..#ifndef
12330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12340 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
12350 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69  Remove any entri
12360 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
12370 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
12380 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
12390 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
123a0 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
123b0 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
123c0 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
123d0 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74  ropped.  ** at t
123e0 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
123f0 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
12400 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
12410 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20  e needs to.  ** 
12420 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
12430 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
12440 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
12450 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
12460 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
12470 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
12480 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
12490 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
124a0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
124b0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
124c0 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
124d0 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  nce WHERE name=%
124e0 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  Q",.      pDb->z
124f0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
12500 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e  e.    );.  }.#en
12510 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
12520 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
12530 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
12540 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
12550 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  fer to the.  ** 
12560 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
12570 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
12580 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
12590 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
125a0 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  es.  ** every ro
125b0 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
125c0 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
125d0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
125e0 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20   one being.  ** 
125f0 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
12600 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
12610 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  parately because
12620 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
12630 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
12640 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
12650 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
12660 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
12670 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62  other.  ** datab
12680 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ase..  */.  sqli
12690 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
126a0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44  Parse, .      "D
126b0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
126c0 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
126d0 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
126e0 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70  igger'",.      p
126f0 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
12700 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
12710 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
12720 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73  ( !isView && !Is
12730 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
12740 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c  .    destroyTabl
12750 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
12760 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
12770 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  e the table entr
12780 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20  y from SQLite's 
12790 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
127a0 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20  and modify.  ** 
127b0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
127c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  e..  */.  if( Is
127d0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
127e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
127f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
12800 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
12810 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
12820 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12830 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12840 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
12850 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
12860 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
12870 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
12880 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71  arse, iDb);.  sq
12890 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
128a0 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  (db, iDb);.}../*
128b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
128c0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
128d0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
128e0 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
128f0 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
12900 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12910 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
12920 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
12930 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
12940 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
12950 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
12960 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f  t isView, int no
12970 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  Err){.  Table *p
12980 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
12990 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
129a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
129b0 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62  t iDb;..  if( db
129c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
129d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
129e0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
129f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
12a00 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61  ->nErr==0 );.  a
12a10 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
12a20 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e  rc==1 );.  if( n
12a30 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
12a40 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62  essErr++;.  pTab
12a50 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
12a60 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
12a70 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65  , isView, &pName
12a80 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e  ->a[0]);.  if( n
12a90 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
12aa0 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28  essErr--;..  if(
12ab0 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
12ac0 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69  if( noErr ) sqli
12ad0 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
12ae0 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  edSchema(pParse,
12af0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
12b00 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74  tabase);.    got
12b10 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
12b20 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  e;.  }.  iDb = s
12b30 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
12b40 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
12b50 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
12b60 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
12b70 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a  db->nDb );..  /*
12b80 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
12b90 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
12ba0 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
12bb0 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
12bc0 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
12bd0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
12be0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
12bf0 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
12c00 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
12c10 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
12c20 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
12c30 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
12c40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c50 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
12c60 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
12c70 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
12c80 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
12c90 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
12ca0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
12cb0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
12cc0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
12cd0 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
12ce0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12cf0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
12d00 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
12d10 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
12d20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
12d30 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
12d40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
12d50 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
12d60 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
12d70 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
12d80 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
12d90 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
12da0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12db0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
12dc0 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
12dd0 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
12de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12df0 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
12e00 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
12e10 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
12e20 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
12e30 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
12e40 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
12e50 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
12e60 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
12e70 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
12e80 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
12e90 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
12ea0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
12eb0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
12ec0 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
12ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12ee0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
12ef0 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
12f00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12f10 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
12f20 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
12f30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
12f40 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
12f50 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
12f60 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
12f70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
12f80 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
12f90 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
12fa0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
12fb0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
12fc0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
12fd0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
12fe0 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
12ff0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
13000 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
13010 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26  ", 7)==0 .    &&
13020 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
13030 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
13040 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29  qlite_stat", 11)
13050 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
13060 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13070 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
13080 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
13090 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
130a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
130b0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
130c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
130d0 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
130e0 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
130f0 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
13100 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
13110 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
13120 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
13130 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
13140 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
13150 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
13160 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13170 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
13180 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
13190 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
131a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
131b0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
131c0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
131d0 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
131e0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
131f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13200 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
13210 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
13220 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
13230 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
13240 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13250 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13260 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13270 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
13280 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
13290 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
132a0 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
132b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
132c0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
132d0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
132e0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
132f0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
13300 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
13310 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
13320 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62  pParse, iDb, "tb
13330 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  l", pTab->zName)
13340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44  ;.    sqlite3FkD
13350 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
13360 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20   pName, pTab);. 
13370 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72     sqlite3CodeDr
13380 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
13390 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65  pTab, iDb, isVie
133a0 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  w);.  }..exit_dr
133b0 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
133c0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
133d0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
133e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
133f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
13400 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
13410 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
13420 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
13430 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
13440 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
13450 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
13460 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
13470 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
13480 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
13490 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
134a0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
134b0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
134c0 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
134d0 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
134e0 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
134f0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
13500 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
13510 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
13520 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
13530 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
13540 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
13550 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
13560 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
13570 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
13580 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
13590 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
135a0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
135b0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
135c0 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
135d0 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
135e0 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
135f0 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
13600 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
13610 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
13620 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
13630 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
13640 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
13650 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
13660 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
13670 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
13680 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
13690 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
136a0 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
136b0 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
136c0 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
136d0 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
136e0 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
136f0 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
13700 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
13710 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
13720 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
13730 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13740 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
13750 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
13760 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
13770 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
13780 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
13790 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
137a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
137b0 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
137c0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
137d0 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
137e0 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
137f0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
13800 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
13810 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
13820 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
13830 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
13840 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
13850 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
13860 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
13870 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
13880 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79  FKey = 0;.  FKey
13890 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62   *pNextTo;.  Tab
138a0 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
138b0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
138c0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
138d0 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
138e0 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
138f0 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
13900 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  f( p==0 || IN_DE
13910 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
13920 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
13930 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
13940 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
13950 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
13960 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29   NEVER(iCol<0) )
13970 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
13980 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
13990 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
139a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
139b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
139c0 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
139d0 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
139e0 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
139f0 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
13a00 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
13a10 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
13a20 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
13a30 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
13a40 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
13a50 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
13a60 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
13a70 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
13a80 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
13a90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13aa0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
13ab0 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
13ac0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
13ad0 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
13ae0 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
13af0 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
13b00 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
13b10 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
13b20 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
13b30 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
13b40 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
13b50 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
13b60 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
13b70 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
13b80 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
13b90 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
13ba0 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
13bb0 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
13bc0 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
13bd0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13be0 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
13bf0 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
13c00 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
13c10 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
13c20 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
13c30 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
13c40 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
13c50 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
13c60 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
13c70 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
13c80 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
13c90 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
13ca0 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
13cb0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
13cc0 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
13cd0 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
13ce0 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
13cf0 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
13d00 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
13d10 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
13d20 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
13d30 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
13d40 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
13d50 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
13d60 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
13d70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
13d80 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
13d90 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
13da0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
13db0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
13dc0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
13dd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
13de0 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
13df0 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
13e00 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
13e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
13e20 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
13e30 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
13e40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13e50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13e60 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
13e70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13e80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13e90 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
13ea0 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
13eb0 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
13ec0 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
13ed0 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
13ee0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
13ef0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
13f00 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
13f10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13f20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
13f30 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
13f40 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
13f50 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
13f60 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
13f70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
13f80 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
13f90 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
13fa0 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
13fb0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
13fc0 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
13fd0 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
13fe0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
13ff0 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
14000 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  ;.  pFKey->aActi
14010 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61  on[0] = (u8)(fla
14020 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20  gs & 0xff);     
14030 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c         /* ON DEL
14040 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ETE action */.  
14050 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31  pFKey->aAction[1
14060 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  ] = (u8)((flags 
14070 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20  >> 8 ) & 0xff); 
14080 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20     /* ON UPDATE 
14090 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  action */..  ass
140a0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
140b0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
140c0 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29  0, p->pSchema) )
140d0 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46  ;.  pNextTo = (F
140e0 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73  Key *)sqlite3Has
140f0 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
14100 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a  ema->fkeyHash, .
14110 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
14120 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
14130 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28  0(pFKey->zTo), (
14140 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29  void *)pFKey.  )
14150 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d  ;.  if( pNextTo=
14160 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62  =pFKey ){.    db
14170 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
14180 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f   1;.    goto fk_
14190 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
141a0 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73  NextTo ){.    as
141b0 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70  sert( pNextTo->p
141c0 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20  PrevTo==0 );.   
141d0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
141e0 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70  = pNextTo;.    p
141f0 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20  NextTo->pPrevTo 
14200 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20  = pFKey;.  }..  
14210 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
14220 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
14230 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
14240 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
14250 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
14260 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
14270 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44  _end:.  sqlite3D
14280 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
14290 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
142a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
142b0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
142c0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
142d0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72  stDelete(db, pFr
142e0 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
142f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
14300 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  db, pToCol);.}..
14310 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14320 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
14330 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
14340 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
14350 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
14360 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
14370 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
14380 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
14390 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
143a0 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
143b0 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
143c0 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
143d0 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
143e0 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
143f0 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
14400 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
14410 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
14420 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
14430 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
14440 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
14450 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
14460 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
14470 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
14480 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
14490 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
144a0 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
144b0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
144c0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
144d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
144e0 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
144f0 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
14500 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
14510 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d  rt( isDeferred==
14520 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d  0 || isDeferred=
14530 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  =1 ); /* EV: R-3
14540 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20  0323-21917 */.  
14550 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
14560 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72  d = (u8)isDeferr
14570 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
14580 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
14590 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
145a0 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
145b0 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
145c0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
145d0 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
145e0 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
145f0 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
14600 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
14610 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
14620 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
14630 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
14640 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
14650 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
14660 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
14670 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
14680 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
14690 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65  The register spe
146a0 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
146b0 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
146c0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
146d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
146e0 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
146f0 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
14700 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
14710 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
14720 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
14730 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
14740 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
14750 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
14760 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
14770 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
14780 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
14790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
147a0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
147b0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
147c0 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
147d0 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
147e0 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
147f0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
14800 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
14810 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
14820 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
14830 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14840 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
14850 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
14860 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
14870 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
14880 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
14890 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
148a0 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
148b0 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20   iSorter;       
148c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
148d0 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  ursor opened by 
148e0 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69  OpenSorter (if i
148f0 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20  n use) */.  int 
14900 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
14910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
14920 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
14930 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
14940 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr2;            
14950 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
14960 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ess to jump to f
14970 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  or next iteratio
14980 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  n */.  int tnum;
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
149b0 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
149c0 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62   int iPartIdxLab
149d0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
149e0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20  /* Jump to this 
149f0 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20  label to skip a 
14a00 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  row */.  Vdbe *v
14a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14a20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
14a30 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
14a40 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
14a50 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
14a60 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
14a70 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
14a80 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
14a90 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
14ac0 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69  ing assemblied i
14ad0 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
14ae0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14af0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
14b00 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
14b10 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
14b20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
14b30 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
14b40 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
14b50 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
14b60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
14b70 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
14b80 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14b90 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
14ba0 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
14bb0 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
14bc0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
14bd0 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
14be0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
14bf0 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
14c00 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
14c10 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
14c20 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
14c30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
14c40 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
14c50 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
14c60 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14c70 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
14c80 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14c90 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
14ca0 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
14cb0 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
14cc0 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
14cd0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
14ce0 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
14cf0 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79  tnum;.  }.  pKey
14d00 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
14d10 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
14d20 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70  Index);..  /* Op
14d30 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75  en the sorter cu
14d40 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74  rsor if we are t
14d50 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  o use one. */.  
14d60 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65  iSorter = pParse
14d70 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
14d80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14d90 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
14da0 69 53 6f 72 74 65 72 2c 20 30 2c 20 30 2c 20 28  iSorter, 0, 0, (
14db0 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  char*)pKey, P4_K
14dc0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f  EYINFO);..  /* O
14dd0 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c  pen the table. L
14de0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
14df0 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c  rows of the tabl
14e00 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64  e, inserting ind
14e10 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20  ex.  ** records 
14e20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
14e30 20 2a 2f 0a 20 20 69 66 28 20 48 61 73 52 6f 77   */.  if( HasRow
14e40 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
14e50 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
14e60 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
14e70 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
14e80 6e 52 65 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  nRead);.  }else{
14e90 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20  .    Index *pPk 
14ea0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
14eb0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
14ec0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 21      assert( pPk!
14ed0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
14ee0 28 20 70 50 6b 2d 3e 74 6e 75 6d 3d 70 54 61 62  ( pPk->tnum=pTab
14ef0 2d 3e 74 6e 75 6d 20 29 3b 0a 20 20 20 20 73 71  ->tnum );.    sq
14f00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14f10 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
14f20 69 54 61 62 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c  iTab, pPk->tnum,
14f30 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
14f40 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
14f50 2a 29 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  *)sqlite3IndexKe
14f60 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 50  yinfo(pParse, pP
14f70 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
14f80 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
14f90 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
14fa0 7d 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  }.  addr1 = sqli
14fb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14fc0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
14fd0 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  , 0);.  regRecor
14fe0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
14ff0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a  mpReg(pParse);..
15000 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
15010 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
15020 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20  , pIndex, iTab, 
15030 72 65 67 52 65 63 6f 72 64 2c 20 31 2c 20 26 69  regRecord, 1, &i
15040 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20  PartIdxLabel);. 
15050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15060 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
15070 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
15080 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
15090 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
150a0 4c 61 62 65 6c 28 76 2c 20 69 50 61 72 74 49 64  Label(v, iPartId
150b0 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74  xLabel);.  sqlit
150c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
150d0 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
150e0 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74  ddr1+1);.  sqlit
150f0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15100 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20  , addr1);.  if( 
15110 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20  memRootPage<0 ) 
15120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15130 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74  2(v, OP_Clear, t
15140 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  num, iDb);.  sql
15150 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15160 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
15170 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c  iIdx, tnum, iDb,
15180 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15190 20 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b        (char *)pK
151a0 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ey, P4_KEYINFO_H
151b0 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74  ANDOFF);.  sqlit
151c0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
151d0 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52  , OPFLAG_BULKCSR
151e0 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  |((memRootPage>=
151f0 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45  0)?OPFLAG_P2ISRE
15200 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20  G:0));..  addr1 
15210 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15220 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
15230 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30  Sort, iSorter, 0
15240 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d  );.  if( pIndex-
15250 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
15260 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20  e ){.    int j2 
15270 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15280 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b  rentAddr(v) + 3;
15290 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
152a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
152b0 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20 61  o, 0, j2);.    a
152c0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
152d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
152e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
152f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
15300 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f  rterCompare, iSo
15310 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63  rter, j2, regRec
15320 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ord);.    sqlite
15330 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
15340 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
15350 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
15360 2c 0a 20 20 20 20 20 20 20 20 4f 45 5f 41 62 6f  ,.        OE_Abo
15370 72 74 2c 20 22 69 6e 64 65 78 65 64 20 63 6f 6c  rt, "indexed col
15380 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69  umns are not uni
15390 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 0a  que", P4_STATIC.
153a0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
153b0 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
153c0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
153d0 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr(v);.  }.  sql
153e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
153f0 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
15400 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
15410 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
15420 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15430 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
15440 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
15450 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15460 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
15470 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
15480 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15490 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
154a0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
154b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
154c0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
154d0 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32  , iSorter, addr2
154e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
154f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
15500 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
15510 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
15520 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
15530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15540 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
15550 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
15560 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
15570 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
15580 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
15590 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
155a0 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
155b0 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
155c0 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
155d0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
155e0 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
155f0 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
15600 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
15610 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
15620 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
15630 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
15640 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
15650 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
15660 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
15670 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
15680 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
15690 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
156a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
156b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
156c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
156d0 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
156e0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
156f0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
15700 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
15710 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
15720 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15730 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
15740 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
15750 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
15760 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
15770 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
15780 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
15790 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
157a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
157b0 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
157c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
157d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
157e0 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
157f0 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
15800 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
15810 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
15820 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
15830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15840 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
15850 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
15860 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
15870 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
15880 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
15890 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
158a0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
158b0 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b  (tRowcnt)*(nCol+
158c0 31 29 20 2b 20 20 20 20 2f 2a 20 49 6e 64 65 78  1) +    /* Index
158d0 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20  .aiRowEst   */. 
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
15900 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
15910 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
15920 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
15930 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
15940 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
15950 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
15960 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
15970 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15980 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
15990 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
159a0 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
159b0 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
159c0 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
159d0 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
159e0 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
159f0 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 70  *)pExtra;      p
15a00 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
15a10 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
15a20 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
15a30 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e 74 2a  wEst = (tRowcnt*
15a40 29 70 45 78 74 72 61 3b 20 20 70 45 78 74 72 61  )pExtra;  pExtra
15a50 20 2b 3d 20 73 69 7a 65 6f 66 28 74 52 6f 77 63   += sizeof(tRowc
15a60 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  nt)*(nCol+1);.  
15a70 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
15a80 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
15a90 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a     pExtra += siz
15aa0 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20  eof(i16)*nCol;. 
15ab0 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
15ac0 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a   = (u8*)pExtra;.
15ad0 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d      p->nColumn =
15ae0 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b   nCol;.    p->nK
15af0 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31  eyCol = nCol - 1
15b00 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d  ;.    *ppExtra =
15b10 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42   ((char*)p) + nB
15b20 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
15b30 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n p;.}../*.** Cr
15b40 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
15b50 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
15b60 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
15b70 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
15b80 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
15b90 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
15ba0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
15bb0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
15bc0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
15bd0 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
15be0 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
15bf0 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
15c00 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
15c10 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
15c20 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
15c30 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
15c40 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
15c50 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
15c60 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
15c70 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
15c80 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
15c90 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
15ca0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
15cb0 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
15cc0 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
15cd0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
15ce0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
15cf0 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
15d00 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
15d10 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
15d20 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
15d30 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
15d40 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
15d50 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
15d60 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
15d70 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
15d80 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
15d90 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
15da0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
15db0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64  **.** If the ind
15dc0 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75  ex is created su
15dd0 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75  ccessfully, retu
15de0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
15df0 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a  the new Index.**
15e00 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73   structure. This
15e10 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
15e20 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
15e30 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69  () to mark the i
15e40 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74  ndex.** as the t
15e50 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
15e60 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49 6e 64  y (Index.autoInd
15e70 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78  ex==2)..*/.Index
15e80 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49   *sqlite3CreateI
15e90 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
15ea0 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c  Parse,     /* Al
15eb0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
15ec0 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
15ed0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
15ee0 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  1,     /* First 
15ef0 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
15f00 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
15f10 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
15f20 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  e2,     /* Secon
15f30 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
15f40 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
15f50 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
15f60 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62  pTblName, /* Tab
15f70 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
15f80 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
15f90 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
15fa0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
15fb0 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
15fc0 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
15fd0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
15fe0 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45  ror,       /* OE
15ff0 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
16000 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
16010 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
16020 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
16030 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
16040 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
16050 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  s this statement
16060 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57   */.  Expr *pPIW
16070 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52  here,    /* WHER
16080 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72  E clause for par
16090 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a  tial indices */.
160a0 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
160b0 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
160c0 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
160d0 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
160e0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
160f0 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d  tExist     /* Om
16100 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
16110 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
16120 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
16130 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pRet = 0;     /*
16140 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75   Pointer to retu
16150 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rn */.  Table *p
16160 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
16170 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
16180 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
16190 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
161a0 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
161b0 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
161c0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
161d0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
161e0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
161f0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
16200 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
16210 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
16220 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
16230 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
16240 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
16250 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
16260 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
16270 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
16280 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
16290 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
162a0 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
162b0 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
162c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
162d0 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
162e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
162f0 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
16300 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
16310 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
16320 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
16330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16340 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
16350 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
16360 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
16370 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
16380 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
16390 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
163a0 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
163b0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
163c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
163d0 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
163e0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
163f0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t */.  const Col
16400 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 20 20 20  umn *pTabCol;   
16410 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c          /* A col
16420 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
16430 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
16440 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16450 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
16460 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45  allocated for zE
16470 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  xtra[] */.  int 
16480 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20  nExtraCol;      
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164a0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
164b0 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a  columns needed *
164c0 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  /.  char *zExtra
164d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
164e0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70       /* Extra sp
164f0 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
16500 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
16510 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20  Index *pPk = 0; 
16520 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20       /* PRIMARY 
16530 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49  KEY index for WI
16540 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
16550 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
16560 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
16570 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76 65   );      /* Neve
16580 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
16590 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
165a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
165b0 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  iled || IN_DECLA
165c0 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
165d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
165e0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
165f0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
16600 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
16610 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
16620 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
16630 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
16640 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
16650 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
16660 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
16670 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
16680 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
16690 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
166a0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
166b0 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
166c0 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
166d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
166e0 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
166f0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
16700 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
16710 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
16720 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
16730 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
16740 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
16750 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
16760 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
16770 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
16780 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
16790 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
167a0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
167b0 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
167c0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
167d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
167e0 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b  e && pName->z );
167f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16800 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
16810 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
16820 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
16830 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
16840 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
16850 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
16860 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
16870 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
16880 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
16890 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
168a0 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
168b0 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
168c0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
168d0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
168e0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
168f0 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
16900 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
16910 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d       if( pName2-
16920 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
16930 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
16940 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
16950 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44  ma ){.        iD
16960 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 1;.      }. 
16970 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
16980 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
16990 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
169a0 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
169b0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  me);.    if( sql
169c0 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
169d0 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20  sFix, pTblName) 
169e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
169f0 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
16a00 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
16a10 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
16a20 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
16a30 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
16a40 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
16a50 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
16a60 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
16a70 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
16a80 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
16a90 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26  tem(pParse, 0, &
16aa0 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  pTblName->a[0]);
16ab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
16ac0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
16ad0 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20   || pTab==0 );. 
16ae0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
16af0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
16b00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
16b10 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61   iDb==1 && db->a
16b20 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21  Db[iDb].pSchema!
16b30 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
16b40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
16b50 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16b60 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e  .           "can
16b70 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d  not create a TEM
16b80 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54  P index on non-T
16b90 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22  EMP table \"%s\"
16ba0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
16bb0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
16bc0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
16bd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
16be0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
16bf0 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20  d(pTab) ) pPk = 
16c00 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
16c10 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
16c20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
16c30 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
16c40 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
16c50 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  t==0 );.    pTab
16c60 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
16c70 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
16c80 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
16c90 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
16ca0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
16cb0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
16cc0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
16cd0 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
16ce0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61  ->aDb[iDb];..  a
16cf0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
16d00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
16d10 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
16d20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
16d30 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
16d40 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
16d50 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  =0 .       && sq
16d60 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70  lite3StrNICmp(&p
16d70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61  Tab->zName[7],"a
16d80 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20  ltertab_",9)!=0 
16d90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
16da0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16db0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
16dc0 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
16dd0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
16de0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
16df0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
16e00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16e10 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
16e20 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
16e30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16e40 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
16e50 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
16e60 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
16e70 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
16e80 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
16e90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16ea0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
16eb0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
16ec0 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
16ed0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16ee0 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
16ef0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
16f00 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
16f10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
16f20 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
16f30 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
16f40 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
16f50 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
16f60 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
16f70 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
16f80 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
16f90 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
16fa0 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
16fb0 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
16fc0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
16fd0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
16fe0 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
16ff0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
17000 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
17010 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
17020 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
17030 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
17040 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
17050 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
17060 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
17070 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
17080 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
17090 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
170a0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
170b0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
170c0 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
170d0 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
170e0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
170f0 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
17100 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
17110 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
17120 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
17130 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
17140 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
17150 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
17160 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
17170 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
17180 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
17190 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
171a0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
171b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
171c0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
171d0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
171e0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
171f0 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
17200 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
17210 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
17220 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17230 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
17240 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
17250 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
17260 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
17270 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
17280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17290 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
172a0 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
172b0 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
172c0 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
172d0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
172e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
172f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
17300 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
17310 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
17320 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
17330 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
17340 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
17350 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17360 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
17370 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
17380 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
17390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
173a0 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
173b0 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
173c0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
173d0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
173e0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
173f0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  }.      goto exi
17400 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17410 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
17420 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
17430 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
17440 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
17450 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
17460 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
17470 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
17480 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
17490 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
174a0 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
174b0 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
174c0 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
174d0 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
174e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
174f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17500 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
17510 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
17520 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
17530 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
17540 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17550 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
17560 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
17570 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
17580 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
17590 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
175a0 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
175b0 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
175c0 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
175d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
175e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
175f0 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
17600 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
17610 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
17620 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
17630 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
17640 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
17650 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
17660 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
17670 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
17680 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
17690 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
176a0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
176b0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
176c0 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
176d0 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
176e0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
176f0 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
17700 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
17710 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
17720 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
17730 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
17740 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
17750 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
17760 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
17770 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
17780 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
17790 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
177a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
177b0 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
177c0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
177d0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
177e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
177f0 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e    pList->a[0].zN
17800 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
17810 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
17820 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
17850 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
17860 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  1].zName);.    p
17870 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
17880 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f  rder = (u8)sortO
17890 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
178a0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
178b0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
178c0 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
178d0 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
178e0 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
178f0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
17900 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
17910 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
17920 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
17930 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
17940 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
17950 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
17960 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
17970 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
17980 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  ==TK_COLLATE );.
17990 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
179a0 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
179b0 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
179c0 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  oken));.    }.  
179d0 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
179e0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
179f0 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
17a00 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
17a10 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
17a20 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20  e);.  nExtraCol 
17a30 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65  = pPk ? pPk->nKe
17a40 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64  yCol : 1;.  pInd
17a50 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  ex = sqlite3Allo
17a60 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
17a70 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  db, pList->nExpr
17a80 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20   + nExtraCol,.  
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74      nName + nExt
17ac0 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29  ra + 1, &zExtra)
17ad0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
17ae0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
17af0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17b00 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
17b10 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
17b20 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
17b30 78 2d 3e 61 69 52 6f 77 45 73 74 29 20 29 3b 0a  x->aiRowEst) );.
17b40 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
17b50 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
17b60 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29  Index->azColl) )
17b70 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
17b80 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45  e = zExtra;.  zE
17b90 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20  xtra += nName + 
17ba0 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  1;.  memcpy(pInd
17bb0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
17bc0 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
17bd0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
17be0 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  Tab;.  pIndex->o
17bf0 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
17c00 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
17c10 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  uniqNotNull = on
17c20 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 3b  Error==OE_Abort;
17c30 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
17c40 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61 6d  ndex = (u8)(pNam
17c50 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d  e==0);.  pIndex-
17c60 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
17c70 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
17c80 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20  .  if( pPIWhere 
17c90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
17ca0 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
17cb0 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ce(pParse, pTab,
17cc0 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49   NC_PartIdx, pPI
17cd0 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70  Where, 0);.    p
17ce0 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57  Index->pPartIdxW
17cf0 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b  here = pPIWhere;
17d00 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20  .    pPIWhere = 
17d10 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
17d20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
17d30 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
17d40 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65   0) );..  /* Che
17d50 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
17d60 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53  should honor DES
17d70 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e  C requests on in
17d80 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  dex columns.  */
17d90 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68  .  if( pDb->pSch
17da0 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
17db0 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f  >=4 ){.    sortO
17dc0 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20  rderMask = -1;  
17dd0 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a   /* Honor DESC *
17de0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
17df0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30  ortOrderMask = 0
17e00 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44  ;    /* Ignore D
17e10 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ESC */.  }..  /*
17e20 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20   Scan the names 
17e30 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  of the columns o
17e40 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
17e50 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
17e60 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  ** load the colu
17e70 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20  mn indices into 
17e80 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
17e90 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ure.  Report an 
17ea0 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e  error.  ** if an
17eb0 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  y column is not 
17ec0 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  found..  **.  **
17ed0 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65   TODO:  Add a te
17ee0 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
17ef0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f  that the same co
17f00 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65  lumn is not name
17f10 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  d.  ** more than
17f20 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65   once within the
17f30 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e   same index.  On
17f40 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73  ly the first ins
17f50 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68  tance of.  ** th
17f60 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76  e column will ev
17f70 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68  er be used by th
17f80 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f  e optimizer.  No
17f90 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68  te that using th
17fa0 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75  e.  ** same colu
17fb0 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  mn more than onc
17fc0 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65  e cannot be an e
17fd0 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61  rror because tha
17fe0 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72  t would .  ** br
17ff0 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f  eak backwards co
18000 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74  mpatibility - it
18010 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77   needs to be a w
18020 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  arning..  */.  f
18030 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65  or(i=0, pListIte
18040 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
18050 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
18060 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
18070 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
18080 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49  ColName = pListI
18090 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
180a0 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
180b0 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72  tOrder;.    char
180c0 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
180d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
180e0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
180f0 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f   name */..    fo
18100 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70  r(j=0, pTabCol=p
18110 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
18120 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54  b->nCol; j++, pT
18130 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  abCol++){.      
18140 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
18150 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61  mp(zColName, pTa
18160 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  bCol->zName)==0 
18170 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
18180 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
18190 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
181a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
181b0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
181c0 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
181d0 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20  med %s",.       
181e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
181f0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  olName);.      p
18200 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
18210 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  ma = 1;.      go
18220 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18230 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
18240 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
18250 6f 6c 3c 3d 30 78 37 66 66 66 20 26 26 20 6a 3c  ol<=0x7fff && j<
18260 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 70  =0x7fff );.    p
18270 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
18280 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20  i] = (i16)j;.   
18290 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
182a0 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 69  pExpr ){.      i
182b0 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
182c0 61 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65  assert( pListIte
182d0 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
182e0 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20  _COLLATE );.    
182f0 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49    zColl = pListI
18300 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54  tem->pExpr->u.zT
18310 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  oken;.      nCol
18320 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
18330 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a  n30(zColl) + 1;.
18340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45        assert( nE
18350 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20  xtra>=nColl );. 
18360 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74       memcpy(zExt
18370 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c  ra, zColl, nColl
18380 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  );.      zColl =
18390 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a   zExtra;.      z
183a0 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a  Extra += nColl;.
183b0 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20        nExtra -= 
183c0 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  nColl;.    }else
183d0 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  {.      zColl = 
183e0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
183f0 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21  oll;.      if( !
18400 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20  zColl ) zColl = 
18410 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 7d 0a  "BINARY";.    }.
18420 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
18430 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74  t.busy && !sqlit
18440 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
18450 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
18460 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
18470 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18480 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
18490 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  ->azColl[i] = zC
184a0 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74  oll;.    request
184b0 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  edSortOrder = pL
184c0 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  istItem->sortOrd
184d0 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61  er & sortOrderMa
184e0 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  sk;.    pIndex->
184f0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
18500 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72  (u8)requestedSor
18510 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20  tOrder;.    if( 
18520 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  pTab->aCol[j].no
18530 74 4e 75 6c 6c 3d 3d 30 20 29 20 70 49 6e 64 65  tNull==0 ) pInde
18540 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
18550 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
18560 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  k ){.    for(j=0
18570 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
18580 3b 20 6a 2b 2b 2c 20 69 2b 2b 29 7b 0a 20 20 20  ; j++, i++){.   
18590 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
185a0 75 6d 6e 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 69  umn[i] = pPk->ai
185b0 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
185c0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
185d0 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  i] = pPk->azColl
185e0 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  [j];.      pInde
185f0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
18600 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64   = pPk->aSortOrd
18610 65 72 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  er[j];.    }.  }
18620 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78  else{.    pIndex
18630 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
18640 2d 31 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  -1;.    pIndex->
18650 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e  azColl[i] = "BIN
18660 41 52 59 22 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ARY";.  }.  sqli
18670 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
18680 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20  (pIndex);.  if( 
18690 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
186a0 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49  e==0 ) estimateI
186b0 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78  ndexWidth(pIndex
186c0 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
186d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
186e0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
186f0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
18700 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
18710 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
18720 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
18730 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
18740 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
18750 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
18760 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
18770 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
18780 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
18790 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
187a0 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
187b0 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
187c0 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
187d0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
187e0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
187f0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
18800 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
18810 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
18820 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
18830 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
18840 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
18850 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
18860 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
18870 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
18880 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
18890 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
188a0 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
188b0 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
188c0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
188d0 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
188e0 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
188f0 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
18900 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
18910 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
18920 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55   **.    ** Two U
18930 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
18940 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73   KEY constraints
18950 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
18960 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a  equivalent.    *
18970 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70  * (and thus supp
18980 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f  ressing the seco
18990 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20  nd one) even if 
189a0 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72  they have differ
189b0 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20  ent.    ** sort 
189c0 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20  orders..    **. 
189d0 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61     ** If there a
189e0 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c  re different col
189f0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
18a00 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   or if the colum
18a10 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ns of.    ** the
18a20 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75   constraint occu
18a30 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f  r in different o
18a40 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  rders, then the 
18a50 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
18a60 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
18a70 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62  d distinct and b
18a80 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65  oth result in se
18a90 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a  parate indices..
18aa0 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
18ab0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
18ac0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
18ad0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
18ae0 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
18af0 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
18b00 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
18b10 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
18b20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18b30 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
18b40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18b50 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
18b60 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
18b70 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
18b80 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b  yCol!=pIndex->nK
18b90 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
18ba0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
18bb0 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   k<pIdx->nKeyCol
18bc0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
18bd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a  const char *z1;.
18be0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
18bf0 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  ar *z2;.        
18c00 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
18c10 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
18c20 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
18c30 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
18c40 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
18c50 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
18c60 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
18c70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31  ;.        if( z1
18c80 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53  !=z2 && sqlite3S
18c90 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29  trICmp(z1, z2) )
18ca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18cb0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
18cc0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
18cd0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
18ce0 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
18cf0 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
18d00 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
18d10 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
18d20 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
18d30 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
18d40 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
18d50 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
18d60 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
18d70 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
18d80 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
18d90 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
18da0 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
18db0 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
18dc0 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
18dd0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
18de0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
18df0 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
18e00 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
18e10 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
18e20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
18e30 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
18e40 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
18e50 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
18e60 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
18e70 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
18e80 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72  ecified behavior
18e90 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
18ea0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
18eb0 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
18ec0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
18ed0 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
18ee0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
18ef0 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
18f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18f10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18f30 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
18f40 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
18f50 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
18f60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18f70 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
18f80 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
18f90 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
18fa0 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
18fb0 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
18fc0 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
18fd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18fe0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18ff0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
19000 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
19010 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
19020 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
19030 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
19040 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
19050 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
19060 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
19070 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
19080 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
19090 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
190a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
190b0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
190c0 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
190d0 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20  chema) );.    p 
190e0 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
190f0 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
19100 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
19130 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ->zName, sqlite3
19140 53 74 72 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d  Strlen30(pIndex-
19150 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  >zName),.       
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20     pIndex);.    
19180 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
19190 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
191a0 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
191b0 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
191c0 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
191d0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
191e0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
191f0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19200 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
19210 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
19220 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
19230 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
19240 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
19250 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
19260 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
19270 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
19280 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
19290 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68  0 then create th
192a0 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e  e index on disk.
192b0 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f    This.  ** invo
192c0 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65  lves writing the
192d0 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
192e0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
192f0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a   filling in the.
19300 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20    ** index with 
19310 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
19320 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a  e contents..  **
19330 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e  .  ** The db->in
19340 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65  it.busy is 0 whe
19350 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74  n the user first
19360 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45   enters a CREATE
19370 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d   INDEX .  ** com
19380 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e  mand.  db->init.
19390 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61  busy is 1 when a
193a0 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
193b0 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52  ned and .  ** CR
193c0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
193d0 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f  ments are read o
193e0 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ut of the master
193f0 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a   table.  In.  **
19400 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65   the latter case
19410 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61   the index alrea
19420 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  dy exists on dis
19430 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a  k, which is why.
19440 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61    ** we don't wa
19450 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69  nt to recreate i
19460 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
19470 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
19480 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
19490 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
194a0 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20  a primary key.  
194b0 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ** or UNIQUE con
194c0 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45  straint of a CRE
194d0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
194e0 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20  ent.  Since the 
194f0 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a  table.  ** has j
19500 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
19510 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
19520 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
19530 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
19540 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e  on.  ** step can
19550 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a   be skipped..  *
19560 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50 61  /.  else if( pPa
19570 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a  rse->nErr==0 ){.
19580 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
19590 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
195a0 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
195b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
195c0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
195d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
195e0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
195f0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19600 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72  dex;...    /* Cr
19610 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
19620 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
19630 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
19640 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
19650 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
19660 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
19670 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19680 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
19690 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20  iDb, iMem);..   
196a0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
196b0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
196c0 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
196d0 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
196e0 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
196f0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
19700 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
19710 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
19720 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73   (int)(pParse->s
19730 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e  LastToken.z - pN
19740 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65  ame->z) + pParse
19750 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a  ->sLastToken.n;.
19760 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d        if( pName-
19770 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e  >z[n-1]==';' ) n
19780 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e  --;.      /* A n
19790 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
197a0 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
197b0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
197c0 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  nt */.      zStm
197d0 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
197e0 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73  tf(db, "CREATE%s
197f0 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
19800 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
19810 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
19820 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d  UNIQUE", n, pNam
19830 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
19840 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
19850 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
19860 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
19870 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
19880 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
19890 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
198a0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
198b0 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
198c0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
198d0 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
198e0 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
198f0 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
19900 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
19910 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
19920 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
19930 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
19940 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
19950 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51  ex',%Q,%Q,#%d,%Q
19960 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
19970 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
19980 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
19990 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  b),.        pInd
199a0 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
199b0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
199c0 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20          iMem,.  
199d0 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
199e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
199f0 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
19a00 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ..    /* Fill th
19a10 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
19a20 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
19a30 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61  e schema. Code a
19a40 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20  n OP_Expire.    
19a50 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
19a60 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
19a70 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
19a80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62    */.    if( pTb
19a90 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
19aa0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
19ab0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
19ac0 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
19ad0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
19ae0 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
19af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19b00 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
19b10 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20  Op(v, iDb,.     
19b20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
19b30 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71  tf(db, "name='%q
19b40 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  ' AND type='inde
19b50 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  x'", pIndex->zNa
19b60 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
19b70 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
19b80 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a   OP_Expire, 0);.
19b90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19ba0 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
19bb0 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
19bc0 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
19bd0 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
19be0 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
19bf0 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
19c00 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
19c10 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
19c20 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
19c30 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
19c40 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
19c50 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e  orrect constrain
19c60 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f  t check.  ** pro
19c70 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69  cessing (in sqli
19c80 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74  te3GenerateConst
19c90 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61  raintChecks()) a
19ca0 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55  s part of.  ** U
19cb0 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54  PDATE and INSERT
19cc0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20   statements.  . 
19cd0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
19ce0 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
19cf0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
19d00 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
19d10 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
19d20 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
19d30 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
19d40 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
19d50 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
19d60 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
19d70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
19d80 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
19d90 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
19da0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
19db0 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
19dc0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
19dd0 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
19de0 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
19df0 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
19e00 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
19e10 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
19e20 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
19e30 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
19e40 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
19e50 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
19e60 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
19e70 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
19e80 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b    pRet = pIndex;
19e90 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
19ea0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
19eb0 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
19ec0 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
19ed0 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
19ee0 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64 65  Index ) freeInde
19ef0 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
19f00 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
19f10 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29  te(db, pPIWhere)
19f20 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
19f30 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
19f40 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
19f50 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
19f60 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
19f70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19f80 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
19f90 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
19fa0 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
19fb0 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
19fc0 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
19fd0 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
19fe0 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
19ff0 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
1a000 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
1a010 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
1a020 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
1a030 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63   is suppose to c
1a040 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
1a050 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
1a060 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
1a070 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
1a080 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
1a090 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
1a0a0 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
1a0b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
1a0c0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1a0d0 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
1a0e0 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1a0f0 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
1a100 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
1a110 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
1a120 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
1a130 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
1a140 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
1a150 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
1a160 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
1a170 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  iniation of the 
1a180 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
1a190 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
1a1a0 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
1a1b0 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
1a1c0 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1a1d0 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
1a1e0 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
1a1f0 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
1a200 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1a210 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
1a220 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
1a230 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
1a240 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
1a250 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
1a260 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
1a270 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
1a280 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
1a290 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
1a2a0 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
1a2b0 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
1a2c0 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
1a2d0 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
1a2e0 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
1a2f0 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
1a300 49 64 78 29 7b 0a 20 20 74 52 6f 77 63 6e 74 20  Idx){.  tRowcnt 
1a310 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
1a320 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Est;.  int i;.  
1a330 74 52 6f 77 63 6e 74 20 6e 3b 0a 20 20 61 73 73  tRowcnt n;.  ass
1a340 65 72 74 28 20 61 21 3d 30 20 29 3b 0a 20 20 61  ert( a!=0 );.  a
1a350 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  [0] = pIdx->pTab
1a360 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 69  le->nRowEst;.  i
1a370 66 28 20 61 5b 30 5d 3c 31 30 20 29 20 61 5b 30  f( a[0]<10 ) a[0
1a380 5d 20 3d 20 31 30 3b 0a 20 20 6e 20 3d 20 31 30  ] = 10;.  n = 10
1a390 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
1a3a0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
1a3b0 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  ++){.    a[i] = 
1a3c0 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 35 20 29  n;.    if( n>5 )
1a3d0 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n--;.  }.  if( 
1a3e0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
1a3f0 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b  E_None ){.    a[
1a400 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d  pIdx->nKeyCol] =
1a410 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
1a420 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1a430 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
1a440 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
1a450 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1a460 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
1a470 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
1a480 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
1a490 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
1a4a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1a4b0 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
1a4c0 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
1a4d0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
1a4e0 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
1a4f0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1a500 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
1a510 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1a520 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
1a530 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
1a540 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
1a550 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
1a560 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1a570 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1a580 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1a590 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
1a5a0 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
1a5b0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1a5c0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1a5d0 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
1a5e0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1a5f0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
1a600 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1a610 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
1a620 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
1a630 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1a640 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
1a650 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
1a660 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
1a670 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a680 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1a690 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
1a6a0 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1a6b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1a6c0 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1a6d0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
1a6e0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1a6f0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  se);.    }.    p
1a700 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1a710 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
1a720 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1a730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
1a740 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
1a750 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1a760 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
1a770 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1a780 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
1a790 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
1a7a0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
1a7b0 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
1a7c0 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
1a7d0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1a7e0 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1a7f0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1a800 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
1a810 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
1a820 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1a830 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
1a840 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
1a850 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
1a860 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1a870 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
1a880 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1a890 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
1a8a0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
1a8b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
1a8c0 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
1a8d0 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
1a8e0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1a8f0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
1a900 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
1a910 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1a920 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1a930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a940 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1a950 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
1a960 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
1a970 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
1a980 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1a990 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
1a9a0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
1a9b0 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
1a9c0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a9d0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1a9e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1a9f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1aa00 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
1aa10 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
1aa20 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
1aa30 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1aa40 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1aa50 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1aa60 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1aa70 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1aa80 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
1aa90 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1aaa0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1aab0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
1aac0 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
1aad0 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  Q AND type='inde
1aae0 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  x'",.       db->
1aaf0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
1ab00 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1ab10 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ), pIndex->zName
1ab20 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1ab30 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
1ab40 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
1ab50 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  "idx", pIndex->z
1ab60 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1ab70 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
1ab80 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1ab90 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
1aba0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
1abb0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
1abc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1abd0 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p4(v, OP_DropInd
1abe0 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  ex, iDb, 0, 0, p
1abf0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
1ac00 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
1ac10 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
1ac20 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1ac30 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
1ac40 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20  .** pArray is a 
1ac50 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72  pointer to an ar
1ac60 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
1ac70 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
1ac80 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
1ac90 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
1aca0 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69  size. This routi
1acb0 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44  ne uses sqlite3D
1acc0 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f  bRealloc().** to
1acd0 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61   extend the arra
1ace0 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  y so that there 
1acf0 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  is space for a n
1ad00 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ew object at the
1ad10 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   end..**.** When
1ad20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1ad30 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74  s called, *pnEnt
1ad40 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ry contains the 
1ad50 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1ad60 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e  ** the array (in
1ad70 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68   entries - so th
1ad80 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
1ad90 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a  ((*pnEntry) * sz
1ada0 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20  Entry) bytes.** 
1adb0 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a  in total)..**.**
1adc0 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   If the realloc(
1add0 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20  ) is successful 
1ade0 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20  (i.e. if no OOM 
1adf0 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73  condition occurs
1ae00 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  ), the.** space 
1ae10 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1ae20 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20  e new object is 
1ae30 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79  zeroed, *pnEntry
1ae40 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72   updated to.** r
1ae50 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73  eflect the new s
1ae60 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
1ae70 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
1ae80 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  o the new alloca
1ae90 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64  tion.** returned
1aea0 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  . *pIdx is set t
1aeb0 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
1aec0 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74  he new array ent
1aed0 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ry in this case.
1aee0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1aef0 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  , if the realloc
1af00 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20  () fails, *pIdx 
1af10 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70  is set to -1, *p
1af20 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a  nEntry remains.*
1af30 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  * unchanged and 
1af40 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79  a copy of pArray
1af50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f   returned..*/.vo
1af60 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79  id *sqlite3Array
1af70 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69  Allocate(.  sqli
1af80 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a  te3 *db,      /*
1af90 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   Connection to n
1afa0 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20  otify of malloc 
1afb0 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f  failures */.  vo
1afc0 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20  id *pArray,     
1afd0 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65  /* Array of obje
1afe0 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72  cts.  Might be r
1aff0 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20  eallocated */.  
1b000 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20  int szEntry,    
1b010 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63    /* Size of eac
1b020 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  h object in the 
1b030 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
1b040 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20  pnEntry,     /* 
1b050 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  Number of object
1b060 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  s currently in u
1b070 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64  se */.  int *pId
1b080 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  x         /* Wri
1b090 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  te the index of 
1b0a0 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20  a new slot here 
1b0b0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
1b0c0 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e  .  int n = *pnEn
1b0d0 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20  try;.  if( (n & 
1b0e0 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (n-1))==0 ){.   
1b0f0 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29   int sz = (n==0)
1b100 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20   ? 1 : 2*n;.    
1b110 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c  void *pNew = sql
1b120 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1b130 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45  , pArray, sz*szE
1b140 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70  ntry);.    if( p
1b150 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1b160 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20  *pIdx = -1;.    
1b170 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
1b180 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61  .    }.    pArra
1b190 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  y = pNew;.  }.  
1b1a0 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61  z = (char*)pArra
1b1b0 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e  y;.  memset(&z[n
1b1c0 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
1b1d0 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
1b1e0 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  x = n;.  ++*pnEn
1b1f0 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
1b200 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
1b210 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
1b220 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
1b230 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
1b240 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
1b250 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
1b260 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
1b270 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1b280 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
1b290 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
1b2a0 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
1b2b0 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a  Append(sqlite3 *
1b2c0 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
1b2d0 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
1b2e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1b2f0 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1b300 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1b310 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1b320 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
1b330 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1b340 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1b350 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
1b360 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1b370 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
1b380 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
1b390 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
1b3a0 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
1b3b0 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
1b3c0 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1b3d0 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
1b3e0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1b3f0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1b400 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1b410 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
1b420 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1b430 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1b440 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  pToken);.  retur
1b450 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
1b460 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
1b470 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
1b480 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1b490 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
1b4a0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1b4b0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1b4c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1b4d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1b4e0 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1b4f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b500 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1b510 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
1b520 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1b530 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
1b540 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1b550 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1b560 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1b570 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
1b580 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
1b590 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
1b5a0 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
1b5b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b5c0 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
1b5d0 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
1b5e0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1b5f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1b600 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1b610 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
1b620 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
1b630 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1b640 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
1b650 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
1b660 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
1b670 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1b680 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   -1;.}../*.** Ex
1b690 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61  pand the space a
1b6a0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1b6b0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f   given SrcList o
1b6c0 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61  bject by.** crea
1b6d0 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20  ting nExtra new 
1b6e0 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20  slots beginning 
1b6f0 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61  at iStart.  iSta
1b700 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64  rt is zero based
1b710 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61  ..** New slots a
1b720 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
1b730 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75   For example, su
1b740 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20  ppose a SrcList 
1b750 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69  initially contai
1b760 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20  ns two entries: 
1b770 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e  A,B..** To appen
1b780 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20  d 3 new entries 
1b790 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f  onto the end, do
1b7a0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1b7b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1b7c0 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69  large(db, pSrcli
1b7d0 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a  st, 3, 2);.**.**
1b7e0 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20   After the call 
1b7f0 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63  above it would c
1b800 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e  ontain:  A, B, n
1b810 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a  il, nil, nil..**
1b820 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61   If the iStart a
1b830 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e  rgument had been
1b840 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c   1 instead of 2,
1b850 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1b860 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
1b870 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69  een:  A, nil, ni
1b880 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70  l, nil, B.  To p
1b890 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  repend the new s
1b8a0 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74  lots,.** the iSt
1b8b0 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20  art value would 
1b8c0 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c  be 0.  The resul
1b8d0 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20  t then would.** 
1b8e0 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69  be: nil, nil, ni
1b8f0 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49  l, A, B..**.** I
1b900 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
1b910 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20  ation fails the 
1b920 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61  SrcList is uncha
1b930 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62  nged.  The.** db
1b940 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
1b950 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20  lag will be set 
1b960 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c  to true..*/.SrcL
1b970 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1b980 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71  istEnlarge(.  sq
1b990 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1b9a0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1b9b0 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1b9c0 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20  y of OOM errors 
1b9d0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1b9e0 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53  rc,     /* The S
1b9f0 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c  rcList to be enl
1ba00 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  arged */.  int n
1ba10 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a  Extra,        /*
1ba20 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73   Number of new s
1ba30 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70  lots to add to p
1ba40 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  Src->a[] */.  in
1ba50 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20  t iStart        
1ba60 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72   /* Index in pSr
1ba70 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20  c->a[] of first 
1ba80 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20  new slot */.){. 
1ba90 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61   int i;..  /* Sa
1baa0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
1bab0 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74   calling paramet
1bac0 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
1bad0 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20   iStart>=0 );.  
1bae0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
1baf0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
1bb00 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Src!=0 );.  asse
1bb10 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63  rt( iStart<=pSrc
1bb20 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20  ->nSrc );..  /* 
1bb30 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f  Allocate additio
1bb40 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65  nal space if nee
1bb50 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  ded */.  if( pSr
1bb60 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70  c->nSrc+nExtra>p
1bb70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  Src->nAlloc ){. 
1bb80 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77     SrcList *pNew
1bb90 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63  ;.    int nAlloc
1bba0 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45   = pSrc->nSrc+nE
1bbb0 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47  xtra;.    int nG
1bbc0 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  ot;.    pNew = s
1bbd0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1bbe0 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20  db, pSrc,.      
1bbf0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1bc00 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63  *pSrc) + (nAlloc
1bc10 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d  -1)*sizeof(pSrc-
1bc20 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  >a[0]) );.    if
1bc30 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1bc40 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
1bc50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1bc60 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63       return pSrc
1bc70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
1bc80 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f   = pNew;.    nGo
1bc90 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61  t = (sqlite3DbMa
1bca0 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65  llocSize(db, pNe
1bcb0 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72  w) - sizeof(*pSr
1bcc0 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d  c))/sizeof(pSrc-
1bcd0 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53  >a[0])+1;.    pS
1bce0 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 38  rc->nAlloc = (u8
1bcf0 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  )nGot;.  }..  /*
1bd00 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73   Move existing s
1bd10 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61  lots that come a
1bd20 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69  fter the newly i
1bd30 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20  nserted slots.  
1bd40 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61  ** out of the wa
1bd50 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72  y */.  for(i=pSr
1bd60 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53  c->nSrc-1; i>=iS
1bd70 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  tart; i--){.    
1bd80 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61  pSrc->a[i+nExtra
1bd90 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  ] = pSrc->a[i];.
1bda0 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63    }.  pSrc->nSrc
1bdb0 20 2b 3d 20 28 69 38 29 6e 45 78 74 72 61 3b 0a   += (i8)nExtra;.
1bdc0 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e  .  /* Zero the n
1bdd0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73  ewly allocated s
1bde0 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  lots */.  memset
1bdf0 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74  (&pSrc->a[iStart
1be00 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72  ], 0, sizeof(pSr
1be10 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29  c->a[0])*nExtra)
1be20 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74  ;.  for(i=iStart
1be30 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72  ; i<iStart+nExtr
1be40 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72  a; i++){.    pSr
1be50 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
1be60 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
1be70 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1be80 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64   to the enlarged
1be90 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65   SrcList */.  re
1bea0 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f  turn pSrc;.}.../
1beb0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
1bec0 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  w table name to 
1bed0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
1bee0 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1bef0 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e   SrcList if.** n
1bf00 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65  eed be.  A new e
1bf10 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64 20  ntry is created 
1bf20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  in the SrcList e
1bf30 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73  ven if pTable is
1bf40 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53   NULL..**.** A S
1bf50 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  rcList is return
1bf60 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  ed, or NULL if t
1bf70 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65  here is an OOM e
1bf80 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72  rror.  The retur
1bf90 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d  ned.** SrcList m
1bfa0 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d 65  ight be the same
1bfb0 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74 20   as the SrcList 
1bfc0 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f  that was input o
1bfd0 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a  r it might be.**
1bfe0 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20   a new one.  If 
1bff0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65  an OOM error doe
1c000 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  s occurs, then t
1c010 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f  he prior value o
1c020 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20  f pList.** that 
1c030 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  is input to this
1c040 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f   routine is auto
1c050 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e  matically freed.
1c060 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
1c070 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
1c080 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1c090 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
1c0a0 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
1c0b0 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
1c0c0 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
1c0d0 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
1c0e0 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
1c0f0 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
1c100 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1c110 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
1c120 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1c130 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
1c140 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
1c150 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
1c160 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
1c170 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
1c180 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
1c190 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
1c1a0 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
1c1b0 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
1c1c0 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
1c1d0 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
1c1e0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
1c1f0 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
1c200 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
1c210 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
1c220 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
1c230 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
1c240 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
1c250 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
1c260 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1c270 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1c280 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,0);.**.**
1c290 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
1c2a0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1c2b0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
1c2c0 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
1c2d0 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
1c2e0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1c2f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1c300 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1c310 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
1c320 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
1c330 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
1c340 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20  database name.  
1c350 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a  If C is defined.
1c360 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e  ** then so is B.
1c370 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1c380 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65 20  , we never have 
1c390 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a  a case where:.**
1c3a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1c3b0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1c3c0 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,0,C);.**.**
1c3d0 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64   Both pTable and
1c3e0 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20 61   pDatabase are a
1c3f0 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f  ssumed to be quo
1c400 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20 64  ted.  They are d
1c410 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72  equoted.** befor
1c420 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f  e being added to
1c430 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f   the SrcList..*/
1c440 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1c450 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a  3SrcListAppend(.
1c460 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1c470 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1c480 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1c490 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1c4a0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1c4b0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70  List,     /* App
1c4c0 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c  end to this SrcL
1c4d0 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65  ist. NULL create
1c4e0 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  s a new SrcList 
1c4f0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
1c500 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  le,      /* Tabl
1c510 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20  e to append */. 
1c520 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
1c530 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e    /* Database
1c540 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
1c550 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
1c560 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61 74  ;.  assert( pDat
1c580 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62  abase==0 || pTab
1c590 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e  le!=0 );  /* Can
1c5a0 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68 6f  not have C witho
1c5b0 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c  ut B */.  if( pL
1c5c0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1c5d0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1c5e0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1c5f0 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
1c600 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1c610 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1c620 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
1c630 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  = 1;.  }.  pList
1c640 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1c650 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69  tEnlarge(db, pLi
1c660 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53  st, 1, pList->nS
1c670 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  rc);.  if( db->m
1c680 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1c690 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1c6a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1c6b0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1c6c0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
1c6d0 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
1c6e0 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20  >nSrc-1];.  if( 
1c6f0 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
1c700 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
1c710 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
1c720 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
1c730 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f  tabase ){.    To
1c740 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
1c750 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
1c760 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
1c770 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
1c780 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
1c790 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
1c7a0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1c7b0 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  , pTable);.  pIt
1c7c0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
1c7d0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1c7e0 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
1c7f0 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  se);.  return pL
1c800 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
1c810 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20  sign VdbeCursor 
1c820 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f  index numbers to
1c830 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1c840 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
1c850 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1c860 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
1c870 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1c880 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1c890 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
1c8a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1c8b0 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  em;.  assert(pLi
1c8c0 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  st || pParse->db
1c8d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1c8e0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
1c8f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
1c900 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
1c910 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
1c920 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c930 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
1c940 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
1c950 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
1c960 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
1c970 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
1c980 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
1c990 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c9a0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1c9b0 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
1c9c0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
1c9d0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
1c9e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1c9f0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
1ca00 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
1ca10 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
1ca20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
1ca30 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1ca40 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1ca50 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  *db, SrcList *pL
1ca60 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1ca70 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ca80 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
1ca90 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1caa0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
1cab0 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1cac0 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
1cad0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1cae0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1caf0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74  (db, pItem->zDat
1cb00 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
1cb10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1cb20 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
1cb30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1cb40 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  b, pItem->zAlias
1cb50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1cb60 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1cb70 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  zIndex);.    sql
1cb80 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
1cb90 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29  db, pItem->pTab)
1cba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
1cbb0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  ectDelete(db, pI
1cbc0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
1cbd0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
1cbe0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1cbf0 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pOn);.    sqlite
1cc00 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1cc10 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29  , pItem->pUsing)
1cc20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1cc30 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
1cc40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1cc50 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1cc60 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
1cc70 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72  to add a new ter
1cc80 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  m to the.** end 
1cc90 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f  of a growing FRO
1cca0 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22  M clause.  The "
1ccb0 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1ccc0 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  the part of.** t
1ccd0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1cce0 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1ccf0 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
1cd00 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a  .  "p" is NULL.*
1cd10 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  * if this is the
1cd20 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74   first term of t
1cd30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
1cd40 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
1cd50 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  abase.** are the
1cd60 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
1cd70 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20  le and database 
1cd80 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
1cd90 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a  M clause term..*
1cda0 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  * pDatabase is N
1cdb0 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62  ULL if the datab
1cdc0 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69  ase name qualifi
1cdd0 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20  er is missing - 
1cde0 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73  the.** usual cas
1cdf0 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  e.  If the term 
1ce00 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68 65  has a alias, the
1ce10 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
1ce20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
1ce30 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
1ce40 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
1ce50 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
1ce60 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
1ce70 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
1ce80 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
1ce90 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
1cea0 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
1ceb0 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
1cec0 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
1ced0 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
1cee0 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
1cef0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
1cf00 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1cf10 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
1cf20 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
1cf30 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
1cf40 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
1cf50 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
1cf60 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
1cf70 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
1cf80 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1cf90 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
1cfa0 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
1cfb0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
1cfc0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1cfd0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cff0 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
1d000 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d010 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
1d020 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1d030 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
1d040 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1d050 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
1d060 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
1d070 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
1d080 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1d090 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
1d0a0 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
1d0b0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
1d0c0 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
1d0d0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
1d0e0 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
1d0f0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
1d100 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
1d110 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
1d120 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
1d130 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
1d140 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
1d150 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
1d160 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
1d170 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
1d180 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
1d190 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
1d1a0 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
1d1b0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
1d1c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1d1d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
1d1e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1d1f0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21  rse->db;.  if( !
1d200 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73  p && (pOn || pUs
1d210 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ing) ){.    sqli
1d220 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1d230 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75  se, "a JOIN clau
1d240 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
1d250 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20  efore %s", .    
1d260 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20    (pOn ? "ON" : 
1d270 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a  "USING").    );.
1d280 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1d290 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1d2a0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
1d2b0 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70  ListAppend(db, p
1d2c0 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62  , pTable, pDatab
1d2d0 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ase);.  if( p==0
1d2e0 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72   || NEVER(p->nSr
1d2f0 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74  c==0) ){.    got
1d300 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  o append_from_er
1d310 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  ror;.  }.  pItem
1d320 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1d330 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
1d340 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66  Alias!=0 );.  if
1d350 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  ( pAlias->n ){. 
1d360 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
1d370 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1d380 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
1d390 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
1d3a0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
1d3b0 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
1d3c0 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
1d3d0 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
1d3e0 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
1d3f0 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  .. append_from_e
1d400 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
1d410 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  p==0 );.  sqlite
1d420 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1d430 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  pOn);.  sqlite3I
1d440 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1d450 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  pUsing);.  sqlit
1d460 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1d470 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
1d480 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1d490 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
1d4a0 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
1d4b0 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
1d4c0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1d4d0 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
1d4e0 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
1d4f0 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
1d500 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1d510 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1d520 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
1d530 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
1d540 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
1d550 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
1d560 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  y){.  assert( pI
1d570 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20  ndexedBy!=0 );. 
1d580 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53   if( p && ALWAYS
1d590 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20  (p->nSrc>0) ){. 
1d5a0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1d5b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1d5c0 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1d5d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1d5e0 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d  tem->notIndexed=
1d5f0 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e  =0 && pItem->zIn
1d600 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  dex==0 );.    if
1d610 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d  ( pIndexedBy->n=
1d620 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42  =1 && !pIndexedB
1d630 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y->z ){.      /*
1d640 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22   A "NOT INDEXED"
1d650 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70   clause was supp
1d660 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e  lied. See parse.
1d670 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  y .      ** cons
1d680 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f  truct "indexed_o
1d690 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  pt" for details.
1d6a0 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   */.      pItem-
1d6b0 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b  >notIndexed = 1;
1d6c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d6d0 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20    pItem->zIndex 
1d6e0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1d6f0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1d700 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a  b, pIndexedBy);.
1d710 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1d720 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67  ** When building
1d730 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   up a FROM claus
1d740 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c  e in the parser,
1d750 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
1d760 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c  or.** is initial
1d770 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ly attached to t
1d780 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e  he left operand.
1d790 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67    But the code g
1d7a0 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65  enerator.** expe
1d7b0 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  cts the join ope
1d7c0 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74  rator to be on t
1d7d0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1d7e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1d7f0 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f  ** Shifts all jo
1d800 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f  in operators fro
1d810 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
1d820 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52  for an entire FR
1d830 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a  OM.** clause..**
1d840 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70  .** Example: Sup
1d850 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73  pose the join is
1d860 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1d870 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61  *           A na
1d880 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
1d890 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65   B.**.** The ope
1d8a0 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61  rator is "natura
1d8b0 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20  l cross join".  
1d8c0 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72  The A and B oper
1d8d0 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a  ands are stored.
1d8e0 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e  ** in p->a[0] an
1d8f0 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65  d p->a[1], respe
1d900 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61  ctively.  The pa
1d910 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73  rser initially s
1d920 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65  tores the.** ope
1d930 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54  rator with A.  T
1d940 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66  his routine shif
1d950 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72  ts that operator
1d960 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76   over to B..*/.v
1d970 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1d980 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28  stShiftJoinType(
1d990 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69  SrcList *p){.  i
1d9a0 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
1d9b0 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
1d9c0 2d 3e 61 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d  ->a || p->nSrc==
1d9d0 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  0 );.    for(i=p
1d9e0 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
1d9f0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
1da00 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  i].jointype = p-
1da10 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
1da20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
1da30 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  [0].jointype = 0
1da40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
1da50 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
1da60 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1da70 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
1da80 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1da90 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
1daa0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
1dab0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
1dac0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1dad0 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  e!=0 );.  db = p
1dae0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
1daf0 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a  ert( db!=0 );./*
1db00 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d    if( db->aDb[0]
1db10 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1db20 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  ; */.  if( sqlit
1db30 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1db40 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1db50 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
1db60 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1db70 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1db80 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1db90 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
1dba0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1dbb0 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
1dbc0 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
1dbd0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1dbe0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1dbf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dc00 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1dc10 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
1dc20 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20  USIVE)+1);.     
1dc30 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
1dc40 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20  Btree(v, i);.   
1dc50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1dc60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1dc70 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
1dc80 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
1dc90 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
1dca0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
1dcb0 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
1dcc0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1dcd0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  ){.  Vdbe *v;.. 
1dce0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1dcf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1dd00 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b  pParse->db!=0 );
1dd10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1dd20 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1dd30 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1dd40 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  ON, "COMMIT", 0,
1dd50 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
1dd60 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
1dd70 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1dd80 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1dd90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dda0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1ddb0 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20  Commit, 1, 0);. 
1ddc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c   }.}../*.** Roll
1ddd0 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1dde0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1ddf0 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61  e3RollbackTransa
1de00 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1de10 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
1de20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1de30 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
1de40 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30  t( pParse->db!=0
1de50 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
1de60 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1de70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1de80 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b  CTION, "ROLLBACK
1de90 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
1dea0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
1deb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1dec0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1ded0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1dee0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1def0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20  _AutoCommit, 1, 
1df00 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
1df10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1df20 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1df30 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
1df40 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
1df50 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
1df60 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1df70 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
1df80 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
1df90 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
1dfa0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1dfb0 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
1dfc0 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
1dfd0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1dfe0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1dff0 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
1e000 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
1e010 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1e020 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1e030 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1e040 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
1e050 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
1e060 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
1e070 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49  t az[] = { "BEGI
1e080 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
1e090 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
1e0a0 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
1e0b0 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
1e0c0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
1e0d0 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
1e0e0 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
1e0f0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
1e100 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
1e110 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1e120 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
1e130 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
1e140 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e150 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1e160 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
1e170 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1e180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e190 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
1e1a0 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
1e1b0 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
1e1c0 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
1e1d0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
1e1e0 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
1e1f0 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
1e200 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
1e210 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
1e220 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
1e230 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
1e240 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
1e250 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
1e260 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
1e270 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
1e280 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1e290 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1e2a0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1e2b0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
1e2c0 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
1e2d0 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
1e2e0 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
1e2f0 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63  *pBt;.    static
1e300 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
1e310 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
1e320 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1e330 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
1e340 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1e350 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
1e360 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1e370 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
1e380 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1e390 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
1e3a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1e3b0 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
1e3c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e3d0 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
1e3e0 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c   0, db, &pBt, 0,
1e3f0 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
1e400 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e410 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1e420 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1e430 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
1e440 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
1e450 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
1e460 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
1e470 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1e480 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
1e490 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
1e4a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1e4b0 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d  }.    db->aDb[1]
1e4c0 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  .pBt = pBt;.    
1e4d0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1e4e0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
1e4f0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
1e500 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
1e510 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
1e520 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
1e530 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20  e, -1, 0) ){.   
1e540 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
1e550 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
1e560 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1e570 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1e580 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1e590 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1e5a0 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65 20  will verify the 
1e5b0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e  schema cookie an
1e5c0 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65 61  d start.** a rea
1e5d0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  d-transaction fo
1e5e0 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61  r all named data
1e5f0 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  base files..**.*
1e600 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  * It is importan
1e610 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65 6d  t that all schem
1e620 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65 72  a cookies be ver
1e630 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a  ified and all.**
1e640 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1e650 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62 65  ns be started be
1e660 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65 6c  fore anything el
1e670 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a  se happens in.**
1e680 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
1e690 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75  m.  But this rou
1e6a0 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
1e6b0 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f 74  ed after much ot
1e6c0 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20  her.** code has 
1e6d0 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e 20  been generated. 
1e6e0 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61 74   So here is what
1e6f0 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68   we do:.**.** Th
1e700 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
1e710 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1e720 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e 20  led, we code an 
1e730 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20  OP_Goto that.** 
1e740 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73  will jump to a s
1e750 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68 65  ubroutine at the
1e760 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 67   end of the prog
1e770 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a  ram.  Then we.**
1e780 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64 61   record every da
1e790 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65 64  tabase that need
1e7a0 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65 72  s its schema ver
1e7b0 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
1e7c0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1e7d0 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65 72  sk field.  Later
1e7e0 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68 65  , after all othe
1e7f0 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 0a  r code has been.
1e800 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74 68  ** generated, th
1e810 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  e subroutine tha
1e820 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69  t does the cooki
1e830 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73 20  e verifications 
1e840 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74 68  and.** starts th
1e850 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 77  e transactions w
1e860 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e 64  ill be coded and
1e870 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20   the OP_Goto P2 
1e880 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
1e890 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
1e8a0 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69 6e  o that subroutin
1e8b0 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74 69  e.  The generati
1e8c0 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f  on of the.** coo
1e8d0 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
1e8e0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64 65   subroutine code
1e8f0 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c 69   happens in sqli
1e900 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
1e910 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c  )..**.** If iDb<
1e920 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65 20  0 then code the 
1e930 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64  OP_Goto only - d
1e940 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74 6f  on't set flag to
1e950 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20 73   verify the.** s
1e960 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74  chema on any dat
1e970 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63 61  abases.  This ca
1e980 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f 73  n be used to pos
1e990 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74  ition the OP_Got
1e9a0 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74 68  o.** early in th
1e9b0 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20 77  e code, before w
1e9c0 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64 61  e know if any da
1e9d0 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77 69  tabase tables wi
1e9e0 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76  ll be used..*/.v
1e9f0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
1ea00 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
1ea10 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
1ea20 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
1ea30 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1ea40 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1ea50 50 61 72 73 65 29 3b 0a 0a 23 69 66 6e 64 65 66  Parse);..#ifndef
1ea60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
1ea70 47 47 45 52 0a 20 20 69 66 28 20 70 54 6f 70 6c  GGER.  if( pTopl
1ea80 65 76 65 6c 21 3d 70 50 61 72 73 65 20 29 7b 0a  evel!=pParse ){.
1ea90 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
1eaa0 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
1eab0 20 74 72 69 67 67 65 72 20 69 73 20 63 75 72 72   trigger is curr
1eac0 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 64 65  ently being code
1ead0 64 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 2a  d. In this.    *
1eae0 2a 20 63 61 73 65 2c 20 73 65 74 20 63 6f 6f 6b  * case, set cook
1eaf0 69 65 47 6f 74 6f 20 74 6f 20 61 20 6e 6f 6e 2d  ieGoto to a non-
1eb00 7a 65 72 6f 20 76 61 6c 75 65 20 74 6f 20 73 68  zero value to sh
1eb10 6f 77 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  ow that this fun
1eb20 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
1eb30 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 20 54 68   been called. Th
1eb40 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68  is is used by th
1eb50 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
1eb60 65 43 6f 6e 73 74 61 6e 74 73 28 29 0a 20 20 20  eConstants().   
1eb70 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f   ** function. */
1eb80 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  .    pParse->coo
1eb90 6b 69 65 47 6f 74 6f 20 3d 20 2d 31 3b 0a 20 20  kieGoto = -1;.  
1eba0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
1ebb0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1ebc0 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 56  Goto==0 ){.    V
1ebd0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
1ebe0 47 65 74 56 64 62 65 28 70 54 6f 70 6c 65 76 65  GetVdbe(pTopleve
1ebf0 6c 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  l);.    if( v==0
1ec00 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
1ec10 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
1ec20 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61 20   if there was a 
1ec30 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20  prior error */. 
1ec40 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f     pToplevel->co
1ec50 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
1ec60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ec70 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31  OP_Goto, 0, 0)+1
1ec80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e  ;.  }.  if( iDb>
1ec90 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1eca0 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65  3 *db = pTopleve
1ecb0 6c 2d 3e 64 62 3b 0a 20 20 20 20 79 44 62 4d 61  l->db;.    yDbMa
1ecc0 73 6b 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 61 73  sk mask;..    as
1ecd0 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
1ece0 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
1ecf0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1ed00 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
1ed10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
1ed20 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
1ed30 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 61  ACHED+2 );.    a
1ed40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
1ed50 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
1ed60 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
1ed70 20 6d 61 73 6b 20 3d 20 28 28 79 44 62 4d 61 73   mask = ((yDbMas
1ed80 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 20 20 69  k)1)<<iDb;.    i
1ed90 66 28 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  f( (pToplevel->c
1eda0 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
1edb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54  )==0 ){.      pT
1edc0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
1edd0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1ede0 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f     pToplevel->co
1edf0 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
1ee00 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1ee10 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
1ee20 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20  okie;.      if( 
1ee30 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1ee40 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
1ee50 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
1ee60 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65  pDatabase(pTople
1ee70 76 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  vel);.      }.  
1ee80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1ee90 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62   If argument zDb
1eea0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63   is NULL, then c
1eeb0 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56  all sqlite3CodeV
1eec0 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f  erifySchema() fo
1eed0 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63  r each .** attac
1eee0 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74  hed database. Ot
1eef0 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20  herwise, invoke 
1ef00 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  it for the datab
1ef10 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e  ase named zDb on
1ef20 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
1ef30 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
1ef40 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  edSchema(Parse *
1ef50 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1ef60 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69  ar *zDb){.  sqli
1ef70 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1ef80 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
1ef90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1efa0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
1efb0 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
1efc0 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
1efd0 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20  b->pBt && (!zDb 
1efe0 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  || 0==sqlite3Str
1eff0 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a  ICmp(zDb, pDb->z
1f000 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20  Name)) ){.      
1f010 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1f020 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
1f030 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
1f040 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1f050 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
1f060 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
1f070 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
1f080 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
1f090 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
1f0a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f0b0 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
1f0c0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
1f0d0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
1f0e0 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
1f0f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1f100 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
1f110 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
1f120 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
1f130 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
1f140 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
1f150 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
1f160 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
1f170 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
1f180 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
1f190 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
1f1a0 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
1f1b0 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
1f1c0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
1f1d0 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
1f1e0 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
1f1f0 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
1f200 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1f210 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
1f220 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
1f230 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
1f240 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
1f250 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
1f260 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
1f270 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
1f280 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
1f290 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
1f2a0 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
1f2b0 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
1f2c0 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
1f2d0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
1f2e0 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
1f2f0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1f300 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
1f310 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
1f320 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
1f330 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
1f340 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1f350 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1f360 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
1f370 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1f380 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
1f390 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 77  ;.  pToplevel->w
1f3a0 72 69 74 65 4d 61 73 6b 20 7c 3d 20 28 28 79 44  riteMask |= ((yD
1f3b0 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62 3b 0a 20  bMask)1)<<iDb;. 
1f3c0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
1f3d0 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
1f3e0 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
1f3f0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
1f400 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
1f410 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
1f420 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
1f430 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
1f440 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
1f450 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
1f460 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
1f470 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
1f480 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
1f490 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
1f4a0 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
1f4b0 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
1f4c0 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
1f4d0 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
1f4e0 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
1f4f0 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
1f500 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
1f510 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
1f520 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1f530 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
1f540 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
1f550 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
1f560 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
1f570 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
1f580 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1f590 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1f5a0 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
1f5b0 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
1f5c0 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
1f5d0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1f5e0 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
1f5f0 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
1f600 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
1f610 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
1f620 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
1f630 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
1f640 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
1f650 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
1f660 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
1f670 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
1f680 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
1f690 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
1f6a0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
1f6b0 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
1f6c0 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
1f6d0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1f6e0 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
1f6f0 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
1f700 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
1f710 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
1f720 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
1f730 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
1f740 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
1f750 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
1f760 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
1f770 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
1f780 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
1f790 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
1f7a0 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
1f7b0 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
1f7c0 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
1f7d0 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
1f7e0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
1f7f0 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
1f800 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
1f810 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
1f820 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
1f830 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
1f840 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
1f850 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
1f860 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
1f870 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
1f880 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
1f890 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
1f8a0 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
1f8b0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
1f8c0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
1f8d0 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
1f8e0 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
1f8f0 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
1f900 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
1f910 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
1f920 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
1f930 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
1f940 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
1f950 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1f960 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1f970 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1f980 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
1f990 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
1f9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
1f9b0 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
1f9c0 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
1f9d0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
1f9e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
1f9f0 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
1fa00 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
1fa10 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
1fa20 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
1fa30 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
1fa40 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
1fa50 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1fa60 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
1fa70 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
1fa80 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
1fa90 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
1faa0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1fab0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20   int errCode,   
1fac0 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65     /* extended e
1fad0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
1fae0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
1faf0 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
1fb00 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ype */.  char *p
1fb10 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72  4,         /* Er
1fb20 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
1fb30 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
1fb40 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20     /* P4_STATIC 
1fb50 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20  or P4_TRANSIENT 
1fb60 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
1fb70 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1fb80 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
1fb90 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
1fba0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
1fbb0 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
1fbc0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
1fbd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
1fbe0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
1fbf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1fc00 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
1fc10 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
1fc20 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
1fc30 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  type);.}../*.** 
1fc40 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1fc50 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
1fc60 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1fc70 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
1fc80 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
1fc90 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
1fca0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
1fcb0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1fcc0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
1fcd0 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
1fce0 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
1fcf0 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
1fd00 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
1fd10 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   i;.  assert( zC
1fd20 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  oll!=0 );.  for(
1fd30 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
1fd40 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1fd50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1fd60 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
1fd70 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
1fd80 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d   z!=0 || pIndex-
1fd90 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29  >aiColumn[i]<0 )
1fda0 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
1fdb0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
1fdc0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
1fdd0 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20  rICmp(z, zColl) 
1fde0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1fdf0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1fe00 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1fe10 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
1fe20 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
1fe30 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
1fe40 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1fe50 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
1fe60 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
1fe70 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
1fe80 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
1fe90 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1fea0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1feb0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1fec0 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
1fed0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
1fee0 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
1fef0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
1ff00 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1ff10 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1ff20 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1ff30 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
1ff40 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
1ff50 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
1ff60 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
1ff70 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
1ff80 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
1ff90 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
1ffa0 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
1ffb0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
1ffc0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1ffd0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
1ffe0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
1fff0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
20000 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
20010 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
20020 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
20030 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
20040 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
20050 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
20060 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
20070 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
20080 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
20090 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
200a0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
200b0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
200c0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
200d0 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
200e0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
200f0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
20100 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
20110 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20120 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
20130 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
20140 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
20150 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
20160 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
20170 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
20180 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
20190 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
201a0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
201b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
201c0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
201d0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
201e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
201f0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
20200 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
20210 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
20220 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
20230 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
20240 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
20250 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
20260 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
20270 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
20280 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
20290 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
202a0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
202b0 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
202c0 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20  ) );  /* Needed 
202d0 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
202e0 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30  s */.  for(iDb=0
202f0 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
20300 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
20310 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
20320 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
20330 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
20340 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
20350 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
20360 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
20370 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
20380 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
20390 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
203a0 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
203b0 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
203c0 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
203d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
203e0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
203f0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
20400 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
20410 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
20420 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
20450 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
20460 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
20470 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
20480 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
20490 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
204a0 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
204b0 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
204c0 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
204d0 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
204e0 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
204f0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
20500 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
20510 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
20520 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
20530 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
20540 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
20550 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
20560 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
20570 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
20580 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
20590 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
205a0 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
205b0 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
205c0 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
205d0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
205e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
205f0 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
20600 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
20610 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
20620 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
20630 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
20640 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
20650 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
20660 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
20670 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
20680 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
20690 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
206a0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
206b0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
206c0 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
206d0 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
206e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
206f0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
20700 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20720 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
20730 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
20740 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
20750 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
20760 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
20770 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
20780 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
20790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
207a0 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
207b0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
207c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
207d0 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
207e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
207f0 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
20800 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
20810 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
20820 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
20830 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
20840 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
20850 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
20860 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
20870 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
20880 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
20890 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
208a0 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
208b0 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
208c0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
208d0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
208e0 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
208f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
20900 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
20910 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
20920 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
20930 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
20940 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e  lse if( NEVER(pN
20950 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d  ame2==0) || pNam
20960 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
20970 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
20980 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
20990 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
209a0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
209b0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
209c0 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
209d0 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
209e0 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
209f0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
20a00 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
20a10 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   zColl, 0);.    
20a20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
20a30 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
20a40 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
20a50 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
20a60 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
20a70 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
20a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
20a90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
20aa0 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
20ab0 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
20ac0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
20ad0 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
20ae0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
20af0 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
20b00 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
20b10 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
20b20 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
20b30 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
20b40 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
20b50 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
20b60 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
20b70 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
20b80 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
20b90 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
20ba0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
20bb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
20bc0 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
20bd0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
20be0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
20bf0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
20c00 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
20c10 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
20c20 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
20c30 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
20c40 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
20c50 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
20c60 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
20c70 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
20c80 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
20c90 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
20ca0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20cb0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
20cc0 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
20cd0 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
20ce0 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
20cf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79  *.** Return a dy
20d00 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65  namicly allocate
20d10 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  d KeyInfo struct
20d20 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ure that can be 
20d30 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f  used.** with OP_
20d40 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f  OpenRead or OP_O
20d50 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65  penWrite to acce
20d60 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ss database inde
20d70 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  x pIdx..**.** If
20d80 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70   successful, a p
20d90 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
20da0 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72  w structure is r
20db0 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
20dc0 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c   case.** the cal
20dd0 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
20de0 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73  le for calling s
20df0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20e00 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e   ) on the return
20e10 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20  ed .** pointer. 
20e20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
20e30 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rs (out of memor
20e40 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c  y or missing col
20e50 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65  lation .** seque
20e60 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65  nce), NULL is re
20e70 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
20e80 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75  tate of pParse u
20e90 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
20ea0 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a  t.** the error..
20eb0 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
20ec0 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
20ed0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
20ee0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
20ef0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c  nt i;.  int nCol
20f00 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   = pIdx->nColumn
20f10 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70  ;.  int nKey = p
20f20 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
20f30 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 0a  KeyInfo *pKey;..
20f40 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
20f50 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
20f60 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e  rse->db, nKey, n
20f70 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 69 66 28  Col-nKey);.  if(
20f80 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 66 6f 72   pKey ){.    for
20f90 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
20fa0 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
20fb0 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
20fc0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69  Coll[i];.      i
20fd0 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 29 20 7a 43  f( zColl==0 ) zC
20fe0 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  oll = "BINARY";.
20ff0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
21000 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f  l[i] = sqlite3Lo
21010 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
21020 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
21030 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
21040 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
21050 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
21060 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50   }.  }..  if( pP
21070 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
21080 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21090 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4b 65 79  pParse->db, pKey
210a0 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b  );.    pKey = 0;
210b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b  .  }.  return pK
210c0 65 79 3b 0a 7d 0a                                ey;.}.