/ Hex Artifact Content
Login

Artifact 67bb05b1077e0cdaccb2e36bfcbe7a5df9ed31e8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
10e0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
10f0: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
1100: 2d 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72  ->nested ) retur
1110: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
1120: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1130: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67  .  /* Begin by g
1140: 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74  enerating some t
1150: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20  ermination code 
1160: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1170: 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67  e.  ** vdbe prog
1180: 72 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ram.  */.  v = s
1190: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11a0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
11b0: 20 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74   !pParse->isMult
11c0: 69 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c  iWrite .       |
11d0: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  | sqlite3VdbeAss
11e0: 65 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70  ertMayAbort(v, p
11f0: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
1200: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1210: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1220: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
1230: 70 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73  pcode(v, OP_Clos
1240: 65 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  e) ){}.    sqlit
1250: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1260: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53  OP_Halt);..#if S
1270: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
1280: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66  NTICATION.    if
1290: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  ( pParse->nTable
12a0: 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e  Lock>0 && db->in
12b0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
12c0: 20 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41      sqlite3UserA
12d0: 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20  uthInit(db);.   
12e0: 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e     if( db->auth.
12f0: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
1300: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
1310: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1320: 49 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20  ITE_AUTH_USER;. 
1330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1340: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1350: 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74  user not authent
1360: 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20  icated");.      
1370: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
1380: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
1390: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69      /* The cooki
13a0: 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
13b0: 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  one bit for each
13c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
13d0: 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74  pen..    ** (Bit
13e0: 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20   0 is for main, 
13f0: 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d  bit 1 is for tem
1400: 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  p, and so forth.
1410: 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20  )  Bits are.    
1420: 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  ** set for each 
1430: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
1440: 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65   used.  Generate
1450: 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61   code to start a
1460: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1470: 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64  ion on each used
1480: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f   database and to
1490: 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
14a0: 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a  ma cookie.    **
14b0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
14c0: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
14d0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
14e0: 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20  cFailed==0 .    
14f0: 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65   && (DbMaskNonZe
1500: 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ro(pParse->cooki
1510: 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65  eMask) || pParse
1520: 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20  ->pConstExpr).  
1530: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69    ){.      int i
1540: 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73  Db, i;.      ass
1550: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
1560: 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63  GetOp(v, 0)->opc
1570: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a  ode==OP_Init );.
1580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1590: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b  eJumpHere(v, 0);
15a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30  .      for(iDb=0
15b0: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
15c0: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Db++){.        i
15d0: 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50  f( DbMaskTest(pP
15e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
15f0: 2c 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74  , iDb)==0 ) cont
1600: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
1610: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
1620: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
1630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1640: 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20  ddOp4Int(v,.    
1650: 20 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63        OP_Transac
1660: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
1670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
1680: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  de */.          
1690: 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
16c0: 20 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74        DbMaskTest
16d0: 28 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61  (pParse->writeMa
16e0: 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a  sk,iDb), /* P2 *
16f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  /.          pPar
1700: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
1710: 69 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f  iDb],          /
1720: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P3 */.        
1730: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
1740: 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74  Schema->iGenerat
1750: 69 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ion  /* P4 */.  
1760: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1770: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1780: 73 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  sy==0 ) sqlite3V
1790: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
17a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  );.      }.#ifnd
17b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
17c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
17d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
17e0: 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20  rse->nVtabLock; 
17f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
1800: 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72  ar *vtab = (char
1810: 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61   *)sqlite3GetVTa
1820: 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ble(db, pParse->
1830: 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b 0a  apVtabLock[i]);.
1840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1850: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1860: 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c  VBegin, 0, 0, 0,
1870: 20 76 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b   vtab, P4_VTAB);
1880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1890: 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b  Parse->nVtabLock
18a0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
18b0: 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20      /* Once all 
18c0: 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65  the cookies have
18d0: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61   been verified a
18e0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nd transactions 
18f0: 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a  opened, .      *
1900: 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  * obtain the req
1910: 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b  uired table-lock
1920: 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  s. This is a no-
1930: 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20  op unless the . 
1940: 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63       ** shared-c
1950: 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20  ache feature is 
1960: 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a  enabled..      *
1970: 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c  /.      codeTabl
1980: 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a  eLocks(pParse);.
1990: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
19a0: 6c 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43  lize any AUTOINC
19b0: 52 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75  REMENT data stru
19c0: 63 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e  ctures required.
19d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19e0: 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65  sqlite3Autoincre
19f0: 6d 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65  mentBegin(pParse
1a00: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
1a10: 65 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  e constant expre
1a20: 73 73 69 6f 6e 73 20 74 68 61 74 20 77 68 65 72  ssions that wher
1a30: 65 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 6f  e factored out o
1a40: 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
1a50: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
1a60: 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 29 7b  e->pConstExpr ){
1a70: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
1a80: 74 20 2a 70 45 4c 20 3d 20 70 50 61 72 73 65 2d  t *pEL = pParse-
1a90: 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20  >pConstExpr;.   
1aa0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43       pParse->okC
1ab0: 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 30 3b 0a  onstFactor = 0;.
1ac0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1ad0: 20 69 3c 70 45 4c 2d 3e 6e 45 78 70 72 3b 20 69   i<pEL->nExpr; i
1ae0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
1af0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1b00: 50 61 72 73 65 2c 20 70 45 4c 2d 3e 61 5b 69 5d  Parse, pEL->a[i]
1b10: 2e 70 45 78 70 72 2c 20 70 45 4c 2d 3e 61 5b 69  .pExpr, pEL->a[i
1b20: 5d 2e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ].u.iConstExprRe
1b30: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
1b40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1b50: 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61  Finally, jump ba
1b60: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
1b70: 69 6e 67 20 6f 66 20 74 68 65 20 65 78 65 63 75  ing of the execu
1b80: 74 61 62 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20  table code. */. 
1b90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ba0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1bb0: 6f 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  o, 0, 1);.    }.
1bc0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74    }...  /* Get t
1bd0: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
1be0: 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74  ready for execut
1bf0: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76  ion.  */.  if( v
1c00: 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 72 73   && ALWAYS(pPars
1c10: 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 21  e->nErr==0) && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1d70: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
1d80: 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  sSet = 0;.  }els
1d90: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  e{.    pParse->r
1da0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1db0: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
1dc0: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72  nTab = 0;.  pPar
1dd0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20  se->nMem = 0;.  
1de0: 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30  pParse->nSet = 0
1df0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  ;.  pParse->nVar
1e00: 20 3d 20 30 3b 0a 20 20 44 62 4d 61 73 6b 5a 65   = 0;.  DbMaskZe
1e10: 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ro(pParse->cooki
1e20: 65 4d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMask);.}../*.**
1e30: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
1e40: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1e50: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
1e60: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
1e70: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
1e80: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1e90: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
1ea0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
1eb0: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
1ec0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
1ed0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
1ee0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
1ef0: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
1f00: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
1f10: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
1f20: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
1f30: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
1f40: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
1f50: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
1f60: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
1f70: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
1f80: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
1f90: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
1fa0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
1fb0: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
1fc0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
1fd0: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
1fe0: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
1ff0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
2000: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
2010: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
2020: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
2030: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
2040: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
2050: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
2060: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
2070: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
2080: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
2090: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
20a0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
20b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
20c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
20d0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
20e0: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
20f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2100: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64   pParse->db;.# d
2110: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
2120: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
2130: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
2140: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
2150: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
2160: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2170: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
2180: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
2190: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
21a0: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
21b0: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
21c0: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
21d0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
21e0: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
21f0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
2200: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
2210: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
2220: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
2230: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
2240: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
2250: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
2260: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
2270: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
2280: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
2290: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
22a0: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
22b0: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
22c0: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
22d0: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
22e0: 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Sql, &zErrMsg);.
22f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2300: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
2310: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2320: 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  , zSql);.  memcp
2330: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
2340: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
2350: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
2360: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53  sted--;.}..#if S
2370: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2380: 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  NTICATION./*.** 
2390: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a  Return TRUE if z
23a0: 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d  Table is the nam
23b0: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
23c0: 74 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65  table that store
23d0: 73 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66  s the.** list of
23e0: 20 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72   users and their
23f0: 20 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69   access credenti
2400: 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  als..*/.int sqli
2410: 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65  te3UserAuthTable
2420: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61  (const char *zTa
2430: 62 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ble){.  return s
2440: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2450: 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75  Table, "sqlite_u
2460: 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  ser")==0;.}.#end
2470: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  if../*.** Locate
2480: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2490: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
24a0: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
24b0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
24c0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
24d0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
24e0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
24f0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2500: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2510: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2520: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2530: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
2550: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
2560: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
2570: 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61  rched for the ta
2580: 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66  ble and the.** f
2590: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61  irst matching ta
25a0: 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
25b0: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66    (No checking f
25c0: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62  or duplicate tab
25d0: 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64  le.** names is d
25e0: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
25f0: 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20  h order is TEMP 
2600: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
2610: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75  , then any.** au
2620: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2630: 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68  s added using th
2640: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
2650: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2660: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
2670: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
2680: 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c  *sqlite3FindTabl
2690: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
26a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
26b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
26c0: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
26d0: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
26e0: 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  i;..#ifdef SQLIT
26f0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
2700: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
2710: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
2720: 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
2730: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
2740: 66 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  f..  /* All mute
2750: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2760: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2770: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2780: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2790: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
27a0: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
27b0: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
27c0: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
27d0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
27e0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
27f0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2800: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
2810: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
2820: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2830: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2840: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2850: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2860: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2870: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2880: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2890: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
28a0: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ndif.  for(i=OMI
28b0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
28c0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
28d0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
28e0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
28f0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2900: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
2910: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
2920: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2930: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2940: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2950: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2960: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2970: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2980: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
2990: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
29a0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
29b0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
29c0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
29d0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
29e0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
29f0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2a00: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2a10: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
2a20: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
2a30: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
2a40: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2a50: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
2a60: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
2a70: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2a80: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2a90: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2aa0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2ab0: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2ac0: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2ad0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2ae0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2af0: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2b00: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2b10: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2b20: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2b30: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2b40: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
2b50: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2b60: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2b70: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
2b80: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
2b90: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
2ba0: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2bb0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2bc0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2bd0: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2be0: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2bf0: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
2c00: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
2c10: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
2c20: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
2c30: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
2c40: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
2c50: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2c60: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2c70: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2c80: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2c90: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2ca0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2cb0: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2cc0: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2cd0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2ce0: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2cf0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2d00: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d10: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2d20: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d30: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d40: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d50: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2d60: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2d70: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2d90: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2da0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2db0: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2dc0: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2dd0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2de0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69  har *zMsg = isVi
2df0: 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69  ew ? "no such vi
2e00: 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74  ew" : "no such t
2e10: 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a  able";.    if( z
2e20: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
2e30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2e40: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
2e50: 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65  s", zMsg, zDbase
2e60: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
2e70: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2e80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2e90: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73  e, "%s: %s", zMs
2ea0: 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  g, zName);.    }
2eb0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
2ec0: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
2ed0: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  }.#if SQLITE_USE
2ee0: 52 5f 41 55 54 48 45 4e 49 43 41 54 49 4f 4e 0a  R_AUTHENICATION.
2ef0: 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73    else if( pPars
2f00: 65 2d 3e 64 62 2d 3e 61 75 74 68 2e 61 75 74 68  e->db->auth.auth
2f10: 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65 72  Level<UAUTH_User
2f20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2f30: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2f40: 22 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e  "user not authen
2f50: 74 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 70  ticated");.    p
2f60: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
2f70: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
2f80: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2f90: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
2fa0: 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54  d by *p..**.** T
2fb0: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
2fc0: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c   around sqlite3L
2fd0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68  ocateTable(). Th
2fe0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2ff0: 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c  ween.** sqlite3L
3000: 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64  ocateTable() and
3010: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
3020: 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
3030: 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a  tion restricts.*
3040: 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  * the search to 
3050: 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65  schema (p->pSche
3060: 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ma) if it is not
3070: 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d   NULL. p->pSchem
3080: 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d  a may be.** non-
3090: 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61  NULL if it is pa
30a0: 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20  rt of a view or 
30b0: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
30c0: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a  definition. See.
30d0: 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
30e0: 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69  List() for detai
30f0: 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ls..*/.Table *sq
3100: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
3110: 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Item(.  Parse *p
3120: 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73  Parse, .  int is
3130: 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20  View, .  struct 
3140: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3150: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3160: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3170: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
3180: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
3190: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
31a0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
31b0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
31c0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
31d0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
31e0: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
31f0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
3200: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  b].zName;.  }els
3210: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
3220: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
3230: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
3240: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
3250: 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e  e, isView, p->zN
3260: 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a  ame, zDb);.}../*
3270: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
3280: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
3290: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
32a0: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
32b0: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
32c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
32d0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
32e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
32f0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
3300: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
3310: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
3320: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
3330: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
3340: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
3350: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
3360: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
3370: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
3380: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
3390: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
33a0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
33b0: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
33c0: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
33d0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
33e0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
33f0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
3400: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
3410: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
3420: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
3430: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
3440: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
3450: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
3460: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
3470: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
3480: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
3490: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
34a0: 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  t i;.  /* All mu
34b0: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
34c0: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
34d0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
34e0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
34f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21  /.  assert( zDb!
3500: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
3510: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
3520: 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69  s(db) );.  for(i
3530: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
3540: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3550: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
3560: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
3570: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
3580: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53  re MAIN */.    S
3590: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
35a0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68   db->aDb[j].pSch
35b0: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
35c0: 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20   pSchema );.    
35d0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
35e0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
35f0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
3600: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3610: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3620: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3630: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
3640: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3650: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3660: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
3670: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
3680: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
3690: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
36a0: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
36b0: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
36c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
36d0: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
36e0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
36f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3700: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
3710: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
3720: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
3730: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 64 62  .#endif.  if( db
3740: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  ==0 || db->pnByt
3750: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
3760: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
3770: 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  (p->pKeyInfo);. 
3780: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3790: 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49  te(db, p->pPartI
37a0: 64 78 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69  dxWhere);.  sqli
37b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
37c0: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
37d0: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
37e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
37f0: 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69  , p->azColl);.#i
3800: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3810: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
3820: 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  4.  sqlite3_free
3830: 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23  (p->aiRowEst);.#
3840: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
3850: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
3860: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
3870: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
3880: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
3890: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
38a0: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
38b0: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
38c0: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
38d0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
38e0: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
38f0: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
3900: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
3910: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
3920: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
3930: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
3940: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
3950: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
3960: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
3970: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
3980: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
3990: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
39a0: 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20   Hash *pHash;.. 
39b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
39c0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
39d0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
39e0: 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44   pHash = &db->aD
39f0: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
3a00: 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64 65  idxHash;.  pInde
3a10: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3a20: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3a30: 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  xName, 0);.  if(
3a40: 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20   ALWAYS(pIndex) 
3a50: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
3a60: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3a70: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
3a80: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
3a90: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
3aa0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
3ab0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
3ac0: 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a  x *p;.      /* J
3ad0: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
3ae0: 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69  ALWAYS();  The i
3af0: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20  ndex must be on 
3b00: 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20  the list of.    
3b10: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f    ** indices. */
3b20: 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65  .      p = pInde
3b30: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3b40: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
3b50: 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e  ALWAYS(p) && p->
3b60: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b  pNext!=pIndex ){
3b70: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d   p = p->pNext; }
3b80: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
3b90: 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  S(p && p->pNext=
3ba0: 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  =pIndex) ){.    
3bb0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
3bc0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3bd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3be0: 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
3bf0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  ndex);.  }.  db-
3c00: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
3c10: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
3c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68  }../*.** Look th
3c30: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f  rough the list o
3c40: 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  f open database 
3c50: 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62  files in db->aDb
3c60: 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79  [] and if.** any
3c70: 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65   have been close
3c80: 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  d, remove them f
3c90: 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52  rom the list.  R
3ca0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a  eallocate the.**
3cb0: 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63   db->aDb[] struc
3cc0: 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65  ture to a smalle
3cd0: 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69  r size, if possi
3ce0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79  ble..**.** Entry
3cf0: 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64   0 (the "main" d
3d00: 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74  atabase) and ent
3d10: 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22  ry 1 (the "temp"
3d20: 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72   database).** ar
3d30: 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74  e never candidat
3d40: 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c  es for being col
3d50: 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  lapsed..*/.void 
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 73 71 6c  atabaseArray(sql
3d80: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
3d90: 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
3da0: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3db0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3dc0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3dd0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3de0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
3df0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3e00: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  e(db, pDb->zName
3e10: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
3e20: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
3e30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
3e40: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
3e50: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
3e60: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
3e70: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
3e80: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
3e90: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
3ea0: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
3eb0: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
3ec0: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3ed0: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3ee0: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3ef0: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3f00: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
3f10: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3f20: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3f40: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
3f50: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
3f60: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3f70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
3f80: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
3f90: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
3fa0: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
3fb0: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
3fc0: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
3fd0: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
3fe0: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
3ff0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
4000: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
4010: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
4020: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
4030: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
4040: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
4050: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
4060: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4070: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
4080: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4090: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
40a0: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
40b0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
40c0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
40d0: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
40e0: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
40f0: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
4100: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
4110: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
4120: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
4130: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
4140: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
4150: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
4160: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
4170: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
4180: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
4190: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
41a0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
41b0: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
41c0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
41d0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
41e0: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
41f0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
4200: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
4210: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
4220: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
4230: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
4240: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
4250: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
4260: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
4270: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
4280: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4290: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
42a0: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
42b0: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
42c0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
42d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
42e0: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
42f0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
4300: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
4310: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
4320: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
4330: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
4340: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
4350: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
4360: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
4370: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
4380: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4390: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
43a0: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
43b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
43c0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
43d0: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
43e0: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
43f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
4400: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
4410: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
4420: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
4430: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
4440: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
4450: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
4460: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
4470: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
4480: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
4490: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
44a0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
44b0: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
44c0: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
44d0: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
44e0: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  y)..*/.static vo
44f0: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43  id sqliteDeleteC
4500: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74  olumnNames(sqlit
4510: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
4520: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
4530: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
4540: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
4550: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
4560: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
4570: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
4580: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
4590: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
45a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
45b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
45c0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
45d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
45e0: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
45f0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
4600: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4610: 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->zDflt);.     
4620: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4630: 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  b, pCol->zType);
4640: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4650: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
4660: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
4670: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4680: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  b, pTable->aCol)
4690: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
46a0: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
46b0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
46c0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
46d0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
46e0: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
46f0: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
4700: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
4710: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
4720: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
4730: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
4740: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
4750: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
4760: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
4770: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
4780: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
4790: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
47a0: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
47b0: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
47c0: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
47d0: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
47e0: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
47f0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ble..**.** The d
4800: 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  b parameter is o
4810: 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20  ptional.  It is 
4820: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61  needed if the Ta
4830: 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  ble object .** c
4840: 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64  ontains lookasid
4850: 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c  e memory.  (Tabl
4860: 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  e objects in the
4870: 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75   schema do not u
4880: 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20  se.** lookaside 
4890: 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65  memory, but some
48a0: 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   ephemeral Table
48b0: 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f   objects do.)  O
48c0: 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61  r the.** db para
48d0: 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65  meter can be use
48e0: 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74  d with db->pnByt
48f0: 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75  esFreed to measu
4900: 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a  re the memory.**
4910: 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62   used by the Tab
4920: 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  le object..*/.vo
4930: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
4940: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
4950: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
4960: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
4970: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45  ex, *pNext;.  TE
4980: 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f  STONLY( int nLoo
4990: 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65  kaside; ) /* Use
49a0: 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b  d to verify look
49b0: 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66  aside not used f
49c0: 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20  or schema */..  
49d0: 61 73 73 65 72 74 28 20 21 70 54 61 62 6c 65 20  assert( !pTable 
49e0: 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e  || pTable->nRef>
49f0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  0 );..  /* Do no
4a00: 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62  t delete the tab
4a10: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66  le until the ref
4a20: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
4a30: 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  ches zero. */.  
4a40: 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65  if( !pTable ) re
4a50: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64  turn;.  if( ((!d
4a60: 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  b || db->pnBytes
4a70: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d  Freed==0) && (--
4a80: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29  pTable->nRef)>0)
4a90: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
4aa0: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
4ab0: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
4ac0: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f  g lookaside allo
4ad0: 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d  cations in schem
4ae0: 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72  a Tables.  ** pr
4af0: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79  ior to doing any
4b00: 20 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f   free() operatio
4b10: 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d  ns.  Since schem
4b20: 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  a Tables do not 
4b30: 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69  use.  ** lookasi
4b40: 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20  de, this number 
4b50: 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67  should not chang
4b60: 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59  e. */.  TESTONLY
4b70: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28  ( nLookaside = (
4b80: 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74  db && (pTable->t
4b90: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
4ba0: 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20  emeral)==0) ?.  
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61         db->looka
4bd0: 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b  side.nOut : 0 );
4be0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4bf0: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4c00: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
4c10: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
4c20: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
4c30: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
4c40: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
4c50: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
4c60: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
4c70: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
4c80: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
4c90: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
4ca0: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ( !db || db->pnB
4cb0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
4cc0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4cd0: 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  e = pIndex->zNam
4ce0: 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e  e; .      TESTON
4cf0: 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64  LY ( Index *pOld
4d00: 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68   = ) sqlite3Hash
4d10: 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  Insert(.        
4d20: 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d   &pIndex->pSchem
4d30: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
4d40: 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  e, 0.      );.  
4d50: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d      assert( db==
4d60: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65  0 || sqlite3Sche
4d70: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4d80: 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
4d90: 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ma) );.      ass
4da0: 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65  ert( pOld==pInde
4db0: 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a  x || pOld==0 );.
4dc0: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
4dd0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
4de0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
4df0: 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65  e any foreign ke
4e00: 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ys attached to t
4e10: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
4e20: 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28  sqlite3FkDelete(
4e30: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
4e40: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61  /* Delete the Ta
4e50: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74  ble structure it
4e60: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  self..  */.  sql
4e70: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
4e80: 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
4e90: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4ea0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  e(db, pTable->zN
4eb0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
4ec0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4ed0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71  ->zColAff);.  sq
4ee0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
4ef0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  e(db, pTable->pS
4f00: 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20  elect);.#ifndef 
4f10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
4f20: 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  K.  sqlite3ExprL
4f30: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
4f40: 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23  able->pCheck);.#
4f50: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
4f60: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4f70: 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
4f80: 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54  VtabClear(db, pT
4f90: 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  able);.#endif.  
4fa0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4fb0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4fc0: 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20   Verify that no 
4fd0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4fe0: 20 77 61 73 20 75 73 65 64 20 62 79 20 73 63 68   was used by sch
4ff0: 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ema tables */.  
5000: 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69  assert( nLookasi
5010: 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73  de==0 || nLookas
5020: 69 64 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ide==db->lookasi
5030: 64 65 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a  de.nOut );.}../*
5040: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67  .** Unlink the g
5050: 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20  iven table from 
5060: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  the hash tables 
5070: 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 74  and the delete t
5080: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75  he.** table stru
5090: 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69  cture with all i
50a0: 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  ts indices and f
50b0: 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a  oreign keys..*/.
50c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
50d0: 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65  nkAndDeleteTable
50e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
50f0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
5100: 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20  r *zTabName){.  
5110: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a  Table *p;.  Db *
5120: 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
5130: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
5140: 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
5150: 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  <db->nDb );.  as
5160: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29  sert( zTabName )
5170: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5180: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
5190: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
51a0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a 54  ;.  testcase( zT
51b0: 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20  abName[0]==0 ); 
51c0: 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20   /* Zero-length 
51d0: 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20  table names are 
51e0: 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62  allowed */.  pDb
51f0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
5200: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48  ;.  p = sqlite3H
5210: 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e  ashInsert(&pDb->
5220: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
5230: 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a  , zTabName, 0);.
5240: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
5250: 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64  able(db, p);.  d
5260: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
5270: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
5280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5290: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
52a0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
52b0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
52c0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
52d0: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
52e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
52f0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
5300: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5310: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
5320: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
5330: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5340: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5350: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5360: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5370: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5380: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5390: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
53a0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
53b0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
53c0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
53d0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
53e0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
53f0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
5400: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
5410: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
5420: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
5430: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5440: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
5450: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5460: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5470: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5480: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5490: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
54a0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
54b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
54c0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
54d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
54e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
54f0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
5500: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
5510: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
5520: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
5530: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5540: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
5550: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5560: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5570: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5580: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5590: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
55a0: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
55b0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
55c0: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
55d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
55e0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
55f0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
5600: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5610: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
5620: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
5630: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5640: 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41  _ROOT, 1, SCHEMA
5650: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
5660: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5670: 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  4Int(v, OP_OpenW
5680: 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f  rite, 0, MASTER_
5690: 52 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20  ROOT, iDb, 5);. 
56a0: 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20   if( p->nTab==0 
56b0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d  ){.    p->nTab =
56c0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
56d0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
56e0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c   points to a nul
56f0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66  -terminated buff
5700: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
5710: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64  e name.** of a d
5720: 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c  atabase ("main",
5730: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
5740: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
5750: 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20  ed db). This.** 
5760: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5770: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
5780: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5790: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
57a0: 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e  r.** -1 if the n
57b0: 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62  amed db cannot b
57c0: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
57d0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
57e0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
57f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5800: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
5810: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5820: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5830: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
5840: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69    Db *pDb;.    i
5850: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
5860: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
5870: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
5880: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
5890: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
58a0: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
58b0: 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44  if( (!OMIT_TEMPD
58c0: 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e  B || i!=1 ) && n
58d0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
58e0: 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26  0(pDb->zName) &&
58f0: 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73   .          0==s
5900: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 44  qlite3StrICmp(pD
5910: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  b->zName, zName)
5920: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
5930: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
5950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
5960: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
5970: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
5980: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
5990: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
59a0: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
59b0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
59c0: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
59d0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
59e0: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
59f0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
5a00: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
5a10: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
5a20: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
5a30: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  exist..*/.int sq
5a40: 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69  lite3FindDb(sqli
5a50: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
5a60: 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pName){.  int i;
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a90: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
5aa0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  r */.  char *zNa
5ab0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5ad0: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
5ae0: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e  hing for */.  zN
5af0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
5b00: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
5b10: 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c  Name);.  i = sql
5b20: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
5b30: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  b, zName);.  sql
5b40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
5b50: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
5b60: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
5b70: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
5b80: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
5b90: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
5ba0: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
5bb0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
5bc0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
5bd0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
5be0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
5bf0: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
5c00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
5c10: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
5c20: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5c30: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5c40: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5c50: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5c60: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
5c70: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
5c80: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5c90: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
5ca0: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
5cb0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
5cc0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5cd0: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5ce0: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
5cf0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5d00: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
5d10: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
5d20: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
5d30: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
5d40: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5d50: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5d60: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
5d70: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
5d80: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
5d90: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
5da0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
5db0: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
5dc0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
5dd0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5de0: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5df0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
5e00: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
5e10: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
5e20: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
5e30: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
5e40: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
5e50: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
5e60: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
5e70: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
5e80: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
5e90: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
5ea0: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
5eb0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
5ec0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
5ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5ee0: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
5ef0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
5f00: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5f10: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41  se->db;..  if( A
5f20: 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29  LWAYS(pName2!=0)
5f30: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
5f40: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  ){.    if( db->i
5f50: 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20  nit.busy ) {.   
5f60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5f70: 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
5f80: 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a  upt database");.
5f90: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
5fa0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
5fb0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
5fc0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
5fd0: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
5fe0: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
5ff0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
6000: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
6010: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6020: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
6030: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
6040: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50  Name1);.      pP
6050: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
6060: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
6070: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6080: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
6090: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
60a0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
60b0: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
60c0: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
60d0: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
60e0: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
60f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
6100: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
6110: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
6120: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
6130: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
6140: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
6150: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
6160: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
6170: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
6180: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
6190: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
61a0: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
61b0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
61c0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
61d0: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
61e0: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
61f0: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
6200: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
6210: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
6220: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
6230: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
6240: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6250: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6260: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6270: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
6280: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
6290: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
62a0: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
62b0: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
62c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
62d0: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
62e0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
62f0: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
6300: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6310: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
6320: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6330: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
6340: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
6350: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
6360: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
6370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
6380: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
6390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
63a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
63b0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
63c0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
63d0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
63e0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
63f0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
6400: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
6410: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
6420: 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  & !IsPrimaryKeyI
6430: 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e  ndex(p); p=p->pN
6440: 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ext){}.  return 
6450: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6460: 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  rn the column of
6470: 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74   index pIdx that
6480: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
6490: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  table.** column 
64a0: 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31  iCol.  Return -1
64b0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
64c0: 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c  /.i16 sqlite3Col
64d0: 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78  umnOfIndex(Index
64e0: 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c   *pIdx, i16 iCol
64f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
6500: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
6510: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6520: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
6530: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20  ->aiColumn[i] ) 
6540: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
6550: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
6560: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
6570: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
6580: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
6590: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
65a0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
65b0: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
65c0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
65d0: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
65e0: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
65f0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6600: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
6610: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
6620: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6630: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
6640: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
6650: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
6660: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
6670: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
6680: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
6690: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
66a0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
66b0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
66c0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
66d0: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
66e0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
66f0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
6700: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
6710: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
6720: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
6730: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
6740: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
6750: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
6760: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
6770: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
6780: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
6790: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
67a0: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
67b0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
67c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
67d0: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
67e0: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
67f0: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
6800: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
6810: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6820: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6830: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6840: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6850: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6860: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6870: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
6880: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
6890: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
68a0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
68b0: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
68c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
68d0: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
68e0: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
68f0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
6900: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
6910: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6920: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6930: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6940: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6950: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6960: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
6970: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6980: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
6990: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
69a0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
69b0: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
69c0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
69d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
69e0: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
69f0: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
6a00: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
6a10: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
6a20: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6a30: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
6a40: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
6a50: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
6a60: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
6a70: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
6a80: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
6a90: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6aa0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
6ab0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6ac0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
6ad0: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
6ae0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6af0: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
6b00: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
6b10: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6b20: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
6b30: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
6b40: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
6b50: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74  e */..  /* The t
6b60: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
6b70: 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70  e to create is p
6b80: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
6b90: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
6ba0: 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  .  ** pName1 and
6bb0: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
6bc0: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
6bd0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
6be0: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  for example:.  *
6bf0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
6c00: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
6c10: 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68  );.  ** .  ** Th
6c20: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
6c30: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
6c40: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
6c50: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
6c60: 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
6c70: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
6c80: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
6c90: 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  .:.  **.  ** CRE
6ca0: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
6cb0: 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .);.  **.  ** Th
6cc0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
6cd0: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
6ce0: 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a  ame2 is ""..  **
6cf0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62  .  ** The call b
6d00: 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e  elow sets the pN
6d10: 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ame pointer to p
6d20: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
6d30: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a  n (pName1 or.  *
6d40: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
6d50: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
6d60: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
6d70: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69  . The variable i
6d80: 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74  Db is.  ** set t
6d90: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
6da0: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
6db0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6dc0: 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a  ew is to be.  **
6dd0: 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a   created in..  *
6de0: 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  /.  iDb = sqlite
6df0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
6e00: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
6e10: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
6e20: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
6e30: 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f  rn;.  if( !OMIT_
6e40: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6e50: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
6e60: 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  && iDb!=1 ){.   
6e70: 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
6e80: 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68  a temp table, th
6e90: 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  e name may not b
6ea0: 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c  e qualified. Unl
6eb0: 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ess .    ** the 
6ec0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
6ed0: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
6ee0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
6ef0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6f00: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
6f10: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
6f20: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
6f30: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
6f40: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6f50: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
6f60: 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  = 1;..  pParse->
6f70: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
6f80: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  ame;.  zName = s
6f90: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6fa0: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
6fb0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
6fc0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53   return;.  if( S
6fd0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
6fe0: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
6ff0: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
7000: 29 7b 0a 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 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69   }.  if( db->ini
7030: 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  t.iDb==1 ) isTem
7040: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
7050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
7060: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
7070: 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d  t( (isTemp & 1)=
7080: 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20  =isTemp );.  {. 
7090: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
70a0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
70b0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
70c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
70d0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
70e0: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
70f0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
7100: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
7110: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
7120: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7130: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
7140: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
7150: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
7160: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
7170: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
7180: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
7190: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
71a0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
71b0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
71c0: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
71d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
71e0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
71f0: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
7200: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
7210: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
7220: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
7230: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
7240: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
7250: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
7260: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69   }.    if( !isVi
7270: 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33  rtual && sqlite3
7280: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
7290: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
72a0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
72b0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
72c0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
72d0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
72e0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
72f0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
7300: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
7310: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
7320: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
7330: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
7340: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
7350: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
7360: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
7370: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
7380: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
7390: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
73a0: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
73b0: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
73c0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
73d0: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
73e0: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
73f0: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
7400: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
7410: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
7420: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
7430: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
7440: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
7450: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
7460: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
7470: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  {.    char *zDb 
7480: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
7490: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51  Name;.    if( SQ
74a0: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
74b0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
74c0: 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
74d0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
74e0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  or;.    }.    pT
74f0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
7500: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
7510: 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  e, zDb);.    if(
7520: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
7530: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
7540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7550: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7560: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
7570: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
7580: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7590: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
75a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
75b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
75c0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
75d0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
75e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
75f0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7600: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
7610: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
7620: 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  dex(db, zName, z
7630: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
7640: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7650: 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69  pParse, "there i
7660: 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64  s already an ind
7670: 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  ex named %s", zN
7680: 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
7690: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
76a0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  or;.    }.  }.. 
76b0: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
76c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
76d0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
76e0: 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d  ;.  if( pTable==
76f0: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
7700: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
7710: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
7720: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7730: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
7740: 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  ;.    goto begin
7750: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7760: 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  }.  pTable->zNam
7770: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  e = zName;.  pTa
7780: 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  ble->iPKey = -1;
7790: 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  .  pTable->pSche
77a0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
77b0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61  ].pSchema;.  pTa
77c0: 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ble->nRef = 1;. 
77d0: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
77e0: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
77f0: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
7800: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
7810: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
7820: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
7830: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e   );.  pParse->pN
7840: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
7850: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
7860: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
7870: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
7880: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
7890: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
78a0: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
78b0: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
78c0: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
78d0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
78e0: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
78f0: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
7900: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
7910: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
7920: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
7930: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
7940: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
7950: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
7960: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
7970: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
7980: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
7990: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
79a0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54  Db, 0) );.    pT
79b0: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70  able->pSchema->p
79c0: 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b  SeqTab = pTable;
79d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
79e0: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
79f0: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
7a00: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
7a10: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
7a20: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
7a30: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
7a40: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
7a50: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
7a60: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
7a70: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
7a80: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7a90: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
7aa0: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
7ab0: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
7ac0: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
7ad0: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
7ae0: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
7af0: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
7b00: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
7b10: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
7b20: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
7b30: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
7b40: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
7b50: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
7b60: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
7b70: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
7b80: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
7b90: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
7ba0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
7bb0: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
7bc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
7bd0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  !=0 ){.    int j
7be0: 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46  1;.    int fileF
7bf0: 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72  ormat;.    int r
7c00: 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b  eg1, reg2, reg3;
7c10: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
7c20: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
7c30: 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
7c40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7c50: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7c60: 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56 69 72  LE.    if( isVir
7c70: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
7c80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7c90: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
7ca0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
7cb0: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
7cc0: 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64  format and encod
7cd0: 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74 61 62  ing in the datab
7ce0: 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  ase have not bee
7cf0: 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73  n set, .    ** s
7d00: 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20  et them now..   
7d10: 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70   */.    reg1 = p
7d20: 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20  Parse->regRowid 
7d30: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7d40: 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70 50 61  ;.    reg2 = pPa
7d50: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b  rse->regRoot = +
7d60: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
7d70: 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72     reg3 = ++pPar
7d80: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
7d90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7da0: 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65  v, OP_ReadCookie
7db0: 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52  , iDb, reg3, BTR
7dc0: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b  EE_FILE_FORMAT);
7dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7de0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
7df0: 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  );.    j1 = sqli
7e00: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
7e10: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56   OP_If, reg3); V
7e20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7e30: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
7e40: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
7e50: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
7e60: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
7e70: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
7e80: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
7e90: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
7ea0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7eb0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65  OP_Integer, file
7ec0: 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20  Format, reg3);. 
7ed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ee0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
7ef0: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
7f00: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65  _FILE_FORMAT, re
7f10: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7f20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7f30: 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62  _Integer, ENC(db
7f40: 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  ), reg3);.    sq
7f50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7f60: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
7f70: 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54   iDb, BTREE_TEXT
7f80: 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29  _ENCODING, reg3)
7f90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7fa0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
7fb0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a  ;..    /* This j
7fc0: 75 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c  ust creates a pl
7fd0: 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72  ace-holder recor
7fe0: 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  d in the sqlite_
7ff0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20  master table..  
8000: 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20    ** The record 
8010: 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74  created does not
8020: 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e   contain anythin
8030: 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20  g yet.  It will 
8040: 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20  be replaced.    
8050: 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65  ** by the real e
8060: 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e  ntry in code gen
8070: 65 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65  erated at sqlite
8080: 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20  3EndTable()..   
8090: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
80a0: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77  owid for the new
80b0: 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69   entry is left i
80c0: 6e 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73  n register pPars
80d0: 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20  e->regRowid..   
80e0: 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   ** The root pag
80f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
8100: 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66  new table is lef
8110: 74 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d  t in reg pParse-
8120: 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a  >regRoot..    **
8130: 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72   The rowid and r
8140: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
8150: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65  values are neede
8160: 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68  d by the code th
8170: 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  at.    ** sqlite
8180: 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67  3EndTable will g
8190: 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a  enerate..    */.
81a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
81b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
81c0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
81d0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
81e0: 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56  BLE).    if( isV
81f0: 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c  iew || isVirtual
8200: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8210: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8220: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
8230: 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  g2);.    }else.#
8240: 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
8250: 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72    pParse->addrCr
8260: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Tab = sqlite3Vdb
8270: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
8280: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
8290: 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  reg2);.    }.   
82a0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
82b0: 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  erTable(pParse, 
82c0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
82d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
82e0: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72  P_NewRowid, 0, r
82f0: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
8300: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8310: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29  P_Null, 0, reg3)
8320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8330: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8340: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
8350: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
8360: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8370: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
8380: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8390: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
83a0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
83b0: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
83c0: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
83d0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
83e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
83f0: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
8400: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
8410: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
8420: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
8430: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
8440: 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  ** This macro is
8450: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
8460: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20   two strings in 
8470: 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  a case-insensiti
8480: 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74  ve manner..** It
8490: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73   is slightly fas
84a0: 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67  ter than calling
84b0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
84c0: 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a  ) directly, but.
84d0: 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67  ** produces larg
84e0: 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57  er code..**.** W
84f0: 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63  ARNING: This mac
8500: 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  ro is not compat
8510: 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 74  ible with the st
8520: 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49  rcmp() family. I
8530: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75  t.** returns tru
8540: 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74 72  e if the two str
8550: 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20  ings are equal, 
8560: 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  otherwise false.
8570: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49  .*/.#define STRI
8580: 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c  CMP(x, y) (\.sql
8590: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
85a0: 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [*(unsigned char
85b0: 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71   *)(x)]==   \.sq
85c0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
85d0: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
85e0: 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26  r *)(y)]     \.&
85f0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
8600: 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30  ((x)+1,(y)+1)==0
8610: 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20   )../*.** Add a 
8620: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
8630: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8640: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
8650: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8660: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
8670: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
8680: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8690: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
86a0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
86b0: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
86c0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
86d0: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
86e0: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
86f0: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
8700: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8710: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
8720: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
8730: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8740: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
8750: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
8760: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
8770: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
8780: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
8790: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
87a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
87b0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
87c0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
87d0: 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49  return;.#if SQLI
87e0: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
87f0: 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62  if( p->nCol+1>db
8800: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8810: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
8820: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8830: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8840: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  o many columns o
8850: 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  n %s", p->zName)
8860: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8870: 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73  }.#endif.  z = s
8880: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
8890: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
88a0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
88b0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
88c0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
88d0: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
88e0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
88f0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
8900: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8910: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
8920: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
8930: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
8940: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8950: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
8960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8970: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
8980: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
8990: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
89a0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
89b0: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
89c0: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
89d0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
89e0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
89f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8a00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
8a10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
8a20: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
8a30: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
8a40: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
8a50: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
8a60: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
8a70: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8a80: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
8a90: 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  z;. .  /* If the
8aa0: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70  re is no type sp
8ab0: 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73  ecified, columns
8ac0: 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c   have the defaul
8ad0: 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20  t affinity.  ** 
8ae0: 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65  'NONE'. If there
8af0: 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69   is a type speci
8b00: 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74  fied, then sqlit
8b10: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
8b20: 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63  ) will.  ** be c
8b30: 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65  alled next to se
8b40: 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  t pCol->affinity
8b50: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
8b60: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
8b70: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
8b80: 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45  ONE;.  pCol->szE
8b90: 73 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f  st = 1;.  p->nCo
8ba0: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
8bb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8bc0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8bd0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8be0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8bf0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8c00: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8c10: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
8c20: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
8c30: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
8c40: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
8c50: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
8c60: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
8c70: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
8c80: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
8c90: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
8ca0: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
8cb0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
8cc0: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
8cd0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20    Table *p;.  p 
8ce0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8cf0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
8d00: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
8d10: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
8d20: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
8d30: 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38  1].notNull = (u8
8d40: 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  )onError;.}../*.
8d50: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
8d60: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
8d70: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
8d80: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
8d90: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
8da0: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
8db0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8dc0: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
8dd0: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
8de0: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
8df0: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
8e00: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
8e10: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
8e20: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
8e30: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
8e40: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8e50: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
8e60: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
8e70: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
8e80: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
8e90: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
8ea0: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
8eb0: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
8ec0: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
8ed0: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
8ee0: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
8ef0: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
8f00: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
8f10: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
8f20: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
8f30: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
8f60: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
8f70: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
8f80: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
8f90: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8fa0: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
8fb0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8fc0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
8fd0: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
8fe0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8ff0: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
9000: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
9010: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
9020: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
9030: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
9040: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9050: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
9060: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9070: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
9080: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
9090: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
90a0: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
90b0: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
90c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
90d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
90e0: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
90f0: 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  yType(const char
9100: 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73   *zIn, u8 *pszEs
9110: 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b  t){.  u32 h = 0;
9120: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51  .  char aff = SQ
9130: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9140: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
9150: 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66  zChar = 0;..  if
9160: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
9170: 6e 20 61 66 66 3b 0a 20 20 77 68 69 6c 65 28 20  n aff;.  while( 
9180: 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20  zIn[0] ){.    h 
9190: 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74  = (h<<8) + sqlit
91a0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
91b0: 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20  *zIn)&0xff];.   
91c0: 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20   zIn++;.    if( 
91d0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
91e0: 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  h'<<16)+('a'<<8)
91f0: 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20  +'r') ){        
9200: 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a       /* CHAR */.
9210: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9220: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
9230: 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a     zChar = zIn;.
9240: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9250: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('c'<<24)+('l'
9260: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9270: 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  b') ){       /* 
9280: 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66  CLOB */.      af
9290: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
92a0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
92b0: 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29  f( h==(('t'<<24)
92c0: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c  +('e'<<16)+('x'<
92d0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20  <8)+'t') ){     
92e0: 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20    /* TEXT */.   
92f0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9300: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
9310: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27  lse if( h==(('b'
9320: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
9330: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('o'<<8)+'b')   
9340: 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a         /* BLOB *
9350: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66  /.        && (af
9360: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9370: 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51  MERIC || aff==SQ
9380: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29  LITE_AFF_REAL) )
9390: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
93a0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
93b0: 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d       if( zIn[0]=
93c0: 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a  ='(' ) zChar = z
93d0: 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  In;.#ifndef SQLI
93e0: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
93f0: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
9400: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
9410: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
9420: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
9430: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
9440: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9450: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9460: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9470: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9480: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9490: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
94a0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
94b0: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
94c0: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
94d0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
94e0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
94f0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9500: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
9510: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9520: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
9530: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
9540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
9550: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
9560: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9570: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9580: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9590: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
95a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
95b0: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
95c0: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
95d0: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
95e0: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
95f0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
9600: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
9610: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
9620: 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69 73 20  /* If pszEst is 
9630: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20  not NULL, store 
9640: 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
9650: 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20  he field size.  
9660: 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74  The.  ** estimat
9670: 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74  e is scaled so t
9680: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
9690: 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e  an integer is 1.
96a0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73    */.  if( pszEs
96b0: 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74  t ){.    *pszEst
96c0: 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75   = 1;   /* defau
96d0: 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f  lt size is appro
96e0: 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20  x 4 bytes */.   
96f0: 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f   if( aff<SQLITE_
9700: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9710: 20 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29       if( zChar )
9720: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
9730: 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20   zChar[0] ){.   
9740: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9750: 65 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b  e3Isdigit(zChar[
9760: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
9770: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20     int v = 0;.  
9780: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9790: 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c  3GetInt32(zChar,
97a0: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
97b0: 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20    v = v/4 + 1;. 
97c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
97d0: 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a  >255 ) v = 255;.
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a              *psz
97f0: 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42  Est = v; /* BLOB
9800: 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c  (k), VARCHAR(k),
9810: 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b   CHAR(k) -> r=(k
9820: 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  /4+1) */.       
9830: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9850: 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20    zChar++;.     
9860: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9870: 7b 0a 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73  {.        *pszEs
9880: 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42  t = 5;   /* BLOB
9890: 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20  , TEXT, CLOB -> 
98a0: 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32 30 20  r=5  (approx 20 
98b0: 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d  bytes)*/.      }
98c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
98d0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
98e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
98f0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9900: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9910: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9920: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9930: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9940: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
9950: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
9960: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
9970: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
9980: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
9990: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
99a0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
99b0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
99c0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
99d0: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
99e0: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
99f0: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
9a00: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
9a10: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
9a20: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
9a30: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
9a40: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
9a50: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
9a60: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
9a70: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
9a80: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
9a90: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9aa0: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
9ab0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
9ac0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70  lumn *pCol;..  p
9ad0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9ae0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
9af0: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
9b00: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
9b10: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
9b20: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61  [p->nCol-1];.  a
9b30: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79  ssert( pCol->zTy
9b40: 70 65 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d  pe==0 );.  pCol-
9b50: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
9b60: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
9b70: 61 72 73 65 2d 3e 64 62 2c 20 70 54 79 70 65 29  arse->db, pType)
9b80: 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ;.  pCol->affini
9b90: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
9ba0: 6e 69 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a  nityType(pCol->z
9bb0: 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  Type, &pCol->szE
9bc0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
9bd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9be0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
9bf0: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
9c00: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
9c10: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
9c20: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
9c30: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9c40: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
9c50: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
9c60: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
9c70: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
9c80: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
9c90: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
9ca0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
9cb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9cc0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
9cd0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
9ce0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
9cf0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
9d00: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
9d10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
9d20: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
9d30: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 53 70   *pParse, ExprSp
9d40: 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61  an *pSpan){.  Ta
9d50: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
9d60: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
9d70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9d80: 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  db;.  p = pParse
9d90: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
9da0: 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70  f( p!=0 ){.    p
9db0: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
9dc0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
9dd0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
9de0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
9df0: 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78  ction(pSpan->pEx
9e00: 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  pr, db->init.bus
9e10: 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  y) ){.      sqli
9e20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9e30: 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c  se, "default val
9e40: 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73  ue of column [%s
9e50: 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e  ] is not constan
9e60: 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  t",.          pC
9e70: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
9e80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
9e90: 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20  A copy of pExpr 
9ea0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  is used instead 
9eb0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c  of the original,
9ec0: 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69   as pExpr contai
9ed0: 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65  ns.      ** toke
9ee0: 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ns that point to
9ef0: 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79   volatile memory
9f00: 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20  . The 'span' of 
9f10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
9f20: 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
9f30: 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74 61  red by pragma ta
9f40: 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20  ble_info..      
9f50: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
9f60: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
9f70: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
9f80: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
9f90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9fa0: 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72  db, pSpan->pExpr
9fb0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
9fc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9fd0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
9fe0: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >zDflt);.      p
9ff0: 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c  Col->zDflt = sql
a000: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
a010: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
a020: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
a050: 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d  t)(pSpan->zEnd -
a060: 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29   pSpan->zStart))
a070: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
a080: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a090: 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72  db, pSpan->pExpr
a0a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69  );.}../*.** Desi
a0b0: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
a0c0: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
a0d0: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
a0e0: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
a0f0: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
a100: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
a110: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
a120: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
a130: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
a140: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
a150: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
a160: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
a170: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
a180: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
a190: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
a1a0: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
a1b0: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
a1c0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
a1d0: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
a1e0: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
a1f0: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
a200: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
a210: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
a220: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
a230: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
a240: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
a250: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
a260: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
a270: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
a280: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
a290: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
a2a0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
a2b0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
a2c0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
a2d0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
a2e0: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
a2f0: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
a300: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
a310: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
a320: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
a330: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
a340: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
a350: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
a360: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
a370: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
a380: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
a390: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
a3a0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
a3b0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
a3c0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
a3d0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
a3e0: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
a3f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
a400: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a410: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a420: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
a430: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
a440: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
a450: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
a460: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
a470: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
a480: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
a490: 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20   int autoInc,   
a4a0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
a4b0: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
a4c0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
a4d0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
a4e0: 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c  Order     /* SQL
a4f0: 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51  ITE_SO_ASC or SQ
a500: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a  LITE_SO_DESC */.
a510: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
a520: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
a530: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
a540: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
a550: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
a560: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20  nt nTerm;.  if( 
a570: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
a580: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
a590: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
a5a0: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
a5b0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
a5c0: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
a5d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
a5e0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
a5f0: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
a600: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
a610: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
a620: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
a630: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
a640: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
a650: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
a660: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
a670: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
a680: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
a690: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
a6a0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
a6b0: 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col].colFlags |=
a6c0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
a6d0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  ;.    zType = pT
a6e0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a6f0: 54 79 70 65 3b 0a 20 20 20 20 6e 54 65 72 6d 20  Type;.    nTerm 
a700: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
a710: 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d    nTerm = pList-
a720: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
a730: 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
a740: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
a750: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
a760: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
a770: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
a780: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
a790: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
a7a0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a7b0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
a7c0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
a7d0: 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20  [iCol].colFlags 
a7e0: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
a7f0: 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  EY;.          zT
a800: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
a810: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
a820: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a830: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a840: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
a850: 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20   nTerm==1.   && 
a860: 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33  zType && sqlite3
a870: 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22  StrICmp(zType, "
a880: 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
a890: 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51  && sortOrder==SQ
a8a0: 4c 49 54 45 5f 53 4f 5f 41 53 43 0a 20 20 29 7b  LITE_SO_ASC.  ){
a8b0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
a8c0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
a8d0: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38  b->keyConf = (u8
a8e0: 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73  )onError;.    as
a8f0: 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30  sert( autoInc==0
a900: 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29   || autoInc==1 )
a910: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
a920: 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a  lags |= autoInc*
a930: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
a940: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
a950: 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72  ) pParse->iPkSor
a960: 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e  tOrder = pList->
a970: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[0].sortOrder;.
a980: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
a990: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
a9a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
a9b0: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
a9c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a9d0: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
a9e0: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
a9f0: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
aa00: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
aa10: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
aa20: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  f.  }else{.    V
aa30: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
aa40: 3e 70 56 64 62 65 3b 0a 20 20 20 20 49 6e 64 65  >pVdbe;.    Inde
aa50: 78 20 2a 70 3b 0a 20 20 20 20 69 66 28 20 76 20  x *p;.    if( v 
aa60: 29 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b  ) pParse->addrSk
aa70: 69 70 50 4b 20 3d 20 73 71 6c 69 74 65 33 56 64  ipPK = sqlite3Vd
aa80: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e  beAddOp0(v, OP_N
aa90: 6f 6f 70 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  oop);.    p = sq
aaa0: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
aab0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
aac0: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
aad0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29  0, sortOrder, 0)
ab00: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
ab10: 20 20 20 20 20 70 2d 3e 69 64 78 54 79 70 65 20       p->idxType 
ab20: 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  = SQLITE_IDXTYPE
ab30: 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20  _PRIMARYKEY;.   
ab40: 20 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74     if( v ) sqlit
ab50: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
ab60: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b  , pParse->addrSk
ab70: 69 70 50 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ipPK);.    }.   
ab80: 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a   pList = 0;.  }.
ab90: 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69  .primary_key_exi
aba0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  t:.  sqlite3Expr
abb0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
abc0: 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  e->db, pList);. 
abd0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
abe0: 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43  * Add a new CHEC
abf0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  K constraint to 
ac00: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
ac10: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
ac20: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
ac30: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
ac40: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
ac50: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
ac60: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ac70: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68  t */.  Expr *pCh
ac80: 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20  eckExpr  /* The 
ac90: 63 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e  check expression
aca0: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
acb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
acc0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
acd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ace0: 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le;.  sqlite3 *d
acf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
ad00: 20 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49    if( pTab && !I
ad10: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20  N_DECLARE_VTAB. 
ad20: 20 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72    && !sqlite3Btr
ad30: 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d  eeIsReadonly(db-
ad40: 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44  >aDb[db->init.iD
ad50: 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20  b].pBt).  ){.   
ad60: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20   pTab->pCheck = 
ad70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
ad80: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54  ppend(pParse, pT
ad90: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65  ab->pCheck, pChe
ada0: 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  ckExpr);.    if(
adb0: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
adc0: 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20  intName.n ){.   
add0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
ade0: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
adf0: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
ae00: 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61  &pParse->constra
ae10: 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  intName, 1);.   
ae20: 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
ae30: 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
ae40: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
ae50: 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78  se->db, pCheckEx
ae60: 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pr);.  }.}../*.*
ae70: 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74  * Set the collat
ae80: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20  ion function of 
ae90: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
aea0: 79 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63  y parsed table c
aeb0: 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  olumn.** to the 
aec0: 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a  CollSeq given..*
aed0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
aee0: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72  dCollateType(Par
aef0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
af00: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61  n *pToken){.  Ta
af10: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
af20: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  .  char *zColl; 
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af40: 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66  Dequoted name of
af50: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
af60: 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nce */.  sqlite3
af70: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20   *db;..  if( (p 
af80: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
af90: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
afa0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  ;.  i = p->nCol-
afb0: 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  1;.  db = pParse
afc0: 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20  ->db;.  zColl = 
afd0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
afe0: 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
aff0: 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29  ;.  if( !zColl )
b000: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
b010: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
b020: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
b030: 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ll) ){.    Index
b040: 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69   *pIdx;.    sqli
b050: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
b060: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b  >aCol[i].zColl);
b070: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
b080: 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  zColl = zColl;. 
b090: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
b0a0: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
b0b0: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
b0c0: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
b0d0: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a  E <type>",.    *
b0e0: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
b0f0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
b100: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
b110: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
b120: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
b130: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
b140: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
b150: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
b160: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
b170: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
b180: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
b190: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
b1a0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65  ssert( pIdx->nKe
b1b0: 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  yCol==1 );.     
b1c0: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
b1d0: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20  umn[0]==i ){.   
b1e0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
b1f0: 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69  l[0] = p->aCol[i
b200: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ].zColl;.      }
b210: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
b220: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
b230: 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
b240: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
b250: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
b260: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
b270: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
b280: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
b290: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
b2a0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
b2b0: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
b2c0: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
b2d0: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
b2e0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
b2f0: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
b300: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
b310: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
b320: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
b330: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
b340: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b350: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
b360: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
b370: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
b380: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
b390: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
b3a0: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
b3b0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
b3c0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
b3d0: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
b3e0: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
b3f0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
b400: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
b410: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
b420: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
b430: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
b440: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
b450: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
b460: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
b470: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
b480: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
b490: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
b4a0: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   pParse..**.** T
b4b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
b4c0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
b4d0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
b4e0: 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  eq().  This rout
b4f0: 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74  ine.** invokes t
b500: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
b510: 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65  tory if the name
b520: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e  d collation cann
b530: 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61  ot be found.** a
b540: 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  nd generates an 
b550: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
b560: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
b570: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
b580: 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43  q(), sqlite3GetC
b590: 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c  ollSeq().*/.Coll
b5a0: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
b5b0: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
b5c0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
b5d0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
b5e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b5f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
b600: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
b610: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
b620: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
b630: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
b640: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
b650: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
b660: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74  enc, zName, init
b670: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
b680: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
b690: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
b6a0: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
b6b0: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
b6c0: 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c  Seq(pParse, enc,
b6d0: 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a   pColl, zName);.
b6e0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43    }..  return pC
b6f0: 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  oll;.}.../*.** G
b700: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
b710: 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  t will increment
b720: 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
b730: 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63  ie..**.** The sc
b740: 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75  hema cookie is u
b750: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
b760: 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
b770: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61   for the.** data
b780: 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41  base changes.  A
b790: 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61  fter each schema
b7a0: 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f   change, the coo
b7b0: 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61  kie value.** cha
b7c0: 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72  nges.  When a pr
b7d0: 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64  ocess first read
b7e0: 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20  s the schema it 
b7f0: 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63  records the.** c
b800: 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74  ookie.  Thereaft
b810: 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20  er, whenever it 
b820: 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  goes to access t
b830: 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20  he database,.** 
b840: 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f  it checks the co
b850: 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  okie to make sur
b860: 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  e the schema has
b870: 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20   not changed.** 
b880: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
b890: 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  t read..**.** Th
b8a0: 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63  is plan is not c
b8b0: 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74  ompletely bullet
b8c0: 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70  -proof.  It is p
b8d0: 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74  ossible for.** t
b8e0: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61  he schema to cha
b8f0: 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  nge multiple tim
b900: 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63  es and for the c
b910: 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73  ookie to be.** s
b920: 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72  et back to prior
b930: 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68   value.  But sch
b940: 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20  ema changes are 
b950: 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e  infrequent.** an
b960: 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  d the probabilit
b970: 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65  y of hitting the
b980: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
b990: 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20  ue is only.** 1 
b9a0: 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20  chance in 2^32. 
b9b0: 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65   So we're safe e
b9c0: 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73  nough..*/.void s
b9d0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
b9e0: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
b9f0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
ba00: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
ba10: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
ba20: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ba30: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ba40: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
ba50: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
ba60: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
ba70: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
ba80: 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  b, 0) );.  sqlit
ba90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
baa0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e  OP_Integer, db->
bab0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
bac0: 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b  ->schema_cookie+
bad0: 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  1, r1);.  sqlite
bae0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
baf0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
bb00: 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56  , BTREE_SCHEMA_V
bb10: 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73  ERSION, r1);.  s
bb20: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
bb30: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
bb40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75  ;.}../*.** Measu
bb50: 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  re the number of
bb60: 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64   characters need
bb70: 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65  ed to output the
bb80: 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69   given.** identi
bb90: 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65  fier.  The numbe
bba0: 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  r returned inclu
bbb0: 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75  des any quotes u
bbc0: 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20  sed.** but does 
bbd0: 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
bbe0: 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e  null terminator.
bbf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
bc00: 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74  ate is conservat
bc10: 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62  ive.  It might b
bc20: 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68  e larger that wh
bc30: 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  at is.** really 
bc40: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
bc50: 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74  c int identLengt
bc60: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  h(const char *z)
bc70: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72  {.  int n;.  for
bc80: 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a  (n=0; *z; n++, z
bc90: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d  ++){.    if( *z=
bca0: 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20  ='"' ){ n++; }. 
bcb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20   }.  return n + 
bcc0: 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  2;.}../*.** The 
bcd0: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
bce0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
bcf0: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
bd00: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
bd10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
bd20: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
bd30: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
bd40: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
bd50: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
bd60: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
bd70: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
bd80: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
bd90: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
bda0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
bdb0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
bdc0: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
bdd0: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
bde0: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
bdf0: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
be00: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
be10: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
be20: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
be30: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
be40: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
be50: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
be60: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
be70: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
be80: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
be90: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
bea0: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
beb0: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
bec0: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
bed0: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
bee0: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
bef0: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
bf00: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
bf10: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
bf20: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
bf30: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
bf40: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
bf50: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
bf60: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
bf70: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
bf80: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
bf90: 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20  SignedIdent){.  
bfa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
bfb0: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
bfc0: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
bfd0: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
bfe0: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
bff0: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
c000: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
c010: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
c020: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
c030: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
c040: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
c050: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
c060: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
c070: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
c080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c090: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
c0a0: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
c0b0: 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20  K_ID.           
c0c0: 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30   || zIdent[j]!=0
c0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c0e0: 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65  j==0;..  if( nee
c0f0: 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20  dQuote ) z[i++] 
c100: 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30  = '"';.  for(j=0
c110: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
c120: 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20  ){.    z[i++] = 
c130: 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69  zIdent[j];.    i
c140: 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22  f( zIdent[j]=='"
c150: 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  ' ) z[i++] = '"'
c160: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64  ;.  }.  if( need
c170: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
c180: 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30   '"';.  z[i] = 0
c190: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d  ;.  *pIdx = i;.}
c1a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c1b0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
c1c0: 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70  statement approp
c1d0: 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
c1e0: 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d  ven.** table.  M
c1f0: 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
c200: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74  e text of the st
c210: 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69  atement is obtai
c220: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
c230: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
c240: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
c250: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
c260: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
c270: 63 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c  char *createTabl
c280: 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64  eStmt(sqlite3 *d
c290: 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  b, Table *p){.  
c2a0: 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63  int i, k, n;.  c
c2b0: 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68  har *zStmt;.  ch
c2c0: 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32  ar *zSep, *zSep2
c2d0: 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d  , *zEnd;.  Colum
c2e0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30  n *pCol;.  n = 0
c2f0: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70  ;.  for(pCol = p
c300: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
c310: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
c320: 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69  l++){.    n += i
c330: 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d  dentLength(pCol-
c340: 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d  >zName) + 5;.  }
c350: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
c360: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
c370: 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20   if( n<50 ){ .  
c380: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
c390: 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20   zSep2 = ",";.  
c3a0: 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20    zEnd = ")";.  
c3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
c3c0: 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53  = "\n  ";.    zS
c3d0: 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20  ep2 = ",\n  ";. 
c3e0: 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b     zEnd = "\n)";
c3f0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b  .  }.  n += 35 +
c400: 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53   6*p->nCol;.  zS
c410: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tmt = sqlite3DbM
c420: 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a  allocRaw(0, n);.
c430: 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29    if( zStmt==0 )
c440: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
c450: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
c460: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c470: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c480: 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41  (n, zStmt, "CREA
c490: 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b  TE TABLE ");.  k
c4a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c4b0: 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65  30(zStmt);.  ide
c4c0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
c4d0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53   p->zName);.  zS
c4e0: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a  tmt[k++] = '(';.
c4f0: 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43    for(pCol=p->aC
c500: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
c510: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
c520: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
c530: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
c540: 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20  azType[] = {.   
c550: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c560: 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22  FF_NONE    */ ""
c570: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c580: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20  ITE_AFF_TEXT    
c590: 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20  */ " TEXT",.    
c5a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c5b0: 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e  F_NUMERIC */ " N
c5c0: 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  UM",.        /* 
c5d0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c5e0: 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20  ER */ " INT",.  
c5f0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c600: 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22  AFF_REAL    */ "
c610: 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20   REAL".    };.  
c620: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63    int len;.    c
c630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
c640: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ;..    sqlite3_s
c650: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
c660: 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20  tmt[k], zSep);. 
c670: 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53     k += sqlite3S
c680: 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b  trlen30(&zStmt[k
c690: 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a  ]);.    zSep = z
c6a0: 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50  Sep2;.    identP
c6b0: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43  ut(zStmt, &k, pC
c6c0: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
c6d0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
c6e0: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
c6f0: 46 5f 4e 4f 4e 45 20 3e 3d 20 30 20 29 3b 0a 20  F_NONE >= 0 );. 
c700: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
c710: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
c720: 5f 41 46 46 5f 4e 4f 4e 45 20 3c 20 41 72 72 61  _AFF_NONE < Arra
c730: 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b  ySize(azType) );
c740: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c750: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c760: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
c770: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c780: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c790: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
c7a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c7b0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c7c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
c7d0: 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63  RIC );.    testc
c7e0: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
c7f0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c800: 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74  INTEGER );.    t
c810: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c820: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c830: 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20  AFF_REAL );.    
c840: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54  .    zType = azT
c850: 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ype[pCol->affini
c860: 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty - SQLITE_AFF_
c870: 4e 4f 4e 45 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d  NONE];.    len =
c880: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c890: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73  (zType);.    ass
c8a0: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
c8b0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c8c0: 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20 20 20  NONE .          
c8d0: 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e    || pCol->affin
c8e0: 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69  ity==sqlite3Affi
c8f0: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20  nityType(zType, 
c900: 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  0) );.    memcpy
c910: 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70  (&zStmt[k], zTyp
c920: 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b  e, len);.    k +
c930: 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72  = len;.    asser
c940: 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20  t( k<=n );.  }. 
c950: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c960: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
c970: 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20  , "%s", zEnd);. 
c980: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
c990: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61  ../*.** Resize a
c9a0: 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  n Index object t
c9b0: 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73  o hold N columns
c9c0: 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20   total.  Return 
c9d0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
c9e0: 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49  success and SQLI
c9f0: 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f  TE_NOMEM on an O
ca00: 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  OM error..*/.sta
ca10: 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e  tic int resizeIn
ca20: 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  dexObject(sqlite
ca30: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49  3 *db, Index *pI
ca40: 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68  dx, int N){.  ch
ca50: 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e  ar *zExtra;.  in
ca60: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
ca70: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20  Idx->nColumn>=N 
ca80: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ca90: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  OK;.  assert( pI
caa0: 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30  dx->isResized==0
cab0: 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73   );.  nByte = (s
cac0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73  izeof(char*) + s
cad0: 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a  izeof(i16) + 1)*
cae0: 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71  N;.  zExtra = sq
caf0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
cb00: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
cb10: 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20  if( zExtra==0 ) 
cb20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cb30: 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  MEM;.  memcpy(zE
cb40: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  xtra, pIdx->azCo
cb50: 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  ll, sizeof(char*
cb60: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
cb70: 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ;.  pIdx->azColl
cb80: 20 3d 20 28 63 68 61 72 2a 2a 29 7a 45 78 74 72   = (char**)zExtr
cb90: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
cba0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a  izeof(char*)*N;.
cbb0: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
cbc0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c   pIdx->aiColumn,
cbd0: 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64   sizeof(i16)*pId
cbe0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
cbf0: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  Idx->aiColumn = 
cc00: 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20  (i16*)zExtra;.  
cc10: 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  zExtra += sizeof
cc20: 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70  (i16)*N;.  memcp
cc30: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
cc40: 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78  aSortOrder, pIdx
cc50: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
cc60: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  dx->aSortOrder =
cc70: 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20   (u8*)zExtra;.  
cc80: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
cc90: 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73  N;.  pIdx->isRes
cca0: 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75  ized = 1;.  retu
ccb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ccc0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
ccd0: 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69  the total row wi
cce0: 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e  dth for a table.
ccf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cd00: 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64  estimateTableWid
cd10: 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  th(Table *pTab){
cd20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62  .  unsigned wTab
cd30: 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  le = 0;.  const 
cd40: 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b  Column *pTabCol;
cd50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
cd60: 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54  i=pTab->nCol, pT
cd70: 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c  abCol=pTab->aCol
cd80: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62  ; i>0; i--, pTab
cd90: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62  Col++){.    wTab
cda0: 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73  le += pTabCol->s
cdb0: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zEst;.  }.  if( 
cdc0: 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20  pTab->iPKey<0 ) 
cdd0: 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62  wTable++;.  pTab
cde0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
cdf0: 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c  ite3LogEst(wTabl
ce00: 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  e*4);.}../*.** E
ce10: 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72  stimate the aver
ce20: 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f  age size of a ro
ce30: 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a  w for an index..
ce40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
ce50: 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
ce60: 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  h(Index *pIdx){.
ce70: 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65    unsigned wInde
ce80: 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  x = 0;.  int i;.
ce90: 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
cea0: 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61  aCol = pIdx->pTa
ceb0: 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72  ble->aCol;.  for
cec0: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
ced0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
cee0: 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61   i16 x = pIdx->a
cef0: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
cf00: 61 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e  assert( x<pIdx->
cf10: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a  pTable->nCol );.
cf20: 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c      wIndex += x<
cf30: 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64  0 ? 1 : aCol[pId
cf40: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  x->aiColumn[i]].
cf50: 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64  szEst;.  }.  pId
cf60: 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71  x->szIdxRow = sq
cf70: 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64  lite3LogEst(wInd
cf80: 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  ex*4);.}../* Ret
cf90: 75 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75  urn true if valu
cfa0: 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79  e x is found any
cfb0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43   of the first nC
cfc0: 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69  ol entries of ai
cfd0: 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20  Col[].*/.static 
cfe0: 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f  int hasColumn(co
cff0: 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20  nst i16 *aiCol, 
d000: 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29  int nCol, int x)
d010: 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d  {.  while( nCol-
d020: 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a  - > 0 ) if( x==*
d030: 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75  (aiCol++) ) retu
d040: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
d050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
d060: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20  routine runs at 
d070: 74 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69  the end of parsi
d080: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
d090: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  E statement that
d0a0: 0a 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55  .** has a WITHOU
d0b0: 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20  T ROWID clause. 
d0c0: 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
d0d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63   routine is to c
d0e0: 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69  onvert both.** i
d0f0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
d100: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
d110: 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  nd the generated
d120: 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68   VDBE code so th
d130: 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61  at they.** are a
d140: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61  ppropriate for a
d150: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
d160: 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  able instead of 
d170: 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a  a rowid table..*
d180: 2a 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64  * Changes includ
d190: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
d1a0: 20 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50    Convert the OP
d1b0: 5f 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74  _CreateTable int
d1c0: 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e  o an OP_CreateIn
d1d0: 64 65 78 2e 20 20 54 68 65 72 65 20 69 73 0a 2a  dex.  There is.*
d1e0: 2a 20 20 20 20 20 20 20 20 20 20 6e 6f 20 72 6f  *          no ro
d1f0: 77 69 64 20 62 74 72 65 65 20 66 6f 72 20 61 20  wid btree for a 
d200: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 20 20  WITHOUT ROWID.  
d210: 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63 61 6e  Instead, the can
d220: 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20  onical.**       
d230: 20 20 20 64 61 74 61 20 73 74 6f 72 61 67 65 20     data storage 
d240: 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  is a covering in
d250: 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20  dex btree..**   
d260: 20 20 28 32 29 20 20 42 79 70 61 73 73 20 74 68    (2)  Bypass th
d270: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
d280: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
d290: 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20  table entry.**  
d2a0: 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20          for the 
d2b0: 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74  PRIMARY KEY as t
d2c0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
d2d0: 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20  ndex is now.**  
d2e0: 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69          identifi
d2f0: 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
d300: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
d310: 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
d320: 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20   itself..**     
d330: 28 33 29 20 20 53 65 74 20 74 68 65 20 49 6e 64  (3)  Set the Ind
d340: 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50  ex.tnum of the P
d350: 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78  RIMARY KEY Index
d360: 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
d370: 2a 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d  *          schem
d380: 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67  a to the rootpag
d390: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  e from the main 
d3a0: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34  table..**     (4
d3b0: 29 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d  )  Set all colum
d3c0: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
d3d0: 59 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a  Y KEY schema obj
d3e0: 65 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55  ect to be NOT NU
d3f0: 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20  LL..**     (5)  
d400: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
d410: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
d420: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f  MARY KEY Index o
d430: 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20  bject.**        
d440: 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52    so that the PR
d450: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63  IMARY KEY is a c
d460: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20  overing index.  
d470: 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20  The surplus.**  
d480: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
d490: 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49  are part of KeyI
d4a0: 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20  nfo.nXField and 
d4b0: 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  are not used for
d4c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72  .**          sor
d4d0: 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f  ting or lookup o
d4e0: 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65  r uniqueness che
d4f0: 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20  cks..**     (6) 
d500: 20 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77   Replace the row
d510: 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61  id tail on all a
d520: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
d530: 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a  erated UNIQUE.**
d540: 20 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65            indice
d550: 73 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41  s with the PRIMA
d560: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a  RY KEY columns..
d570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
d580: 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
d590: 6f 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20  owidTable(Parse 
d5a0: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
d5b0: 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  pTab){.  Index *
d5c0: 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pIdx;.  Index *p
d5d0: 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20  Pk;.  int nPk;. 
d5e0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
d5f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d600: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
d610: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d620: 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ;..  /* Convert 
d630: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62  the OP_CreateTab
d640: 6c 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77  le opcode that w
d650: 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72  ould normally cr
d660: 65 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f  eate the.  ** ro
d670: 6f 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20  ot-page for the 
d680: 74 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50  table into an OP
d690: 5f 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63  _CreateIndex opc
d6a0: 6f 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a  ode.  The index.
d6b0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c    ** created wil
d6c0: 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49  l become the PRI
d6d0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a  MARY KEY index..
d6e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
d6f0: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a  e->addrCrTab ){.
d700: 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b      assert( v );
d710: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d720: 47 65 74 4f 70 28 76 2c 20 70 50 61 72 73 65 2d  GetOp(v, pParse-
d730: 3e 61 64 64 72 43 72 54 61 62 29 2d 3e 6f 70 63  >addrCrTab)->opc
d740: 6f 64 65 20 3d 20 4f 50 5f 43 72 65 61 74 65 49  ode = OP_CreateI
d750: 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ndex;.  }..  /* 
d760: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
d770: 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41  ion of the PRIMA
d780: 52 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64  RY KEY btree and
d790: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
d7a0: 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e  er.  ** table en
d7b0: 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  try..  */.  if( 
d7c0: 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b 69 70  pParse->addrSkip
d7d0: 50 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  PK ){.    assert
d7e0: 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ( v );.    sqlit
d7f0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
d800: 50 61 72 73 65 2d 3e 61 64 64 72 53 6b 69 70 50  Parse->addrSkipP
d810: 4b 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  K)->opcode = OP_
d820: 47 6f 74 6f 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Goto;.  }..  /* 
d830: 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41  Locate the PRIMA
d840: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f  RY KEY index.  O
d850: 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  r, if this table
d860: 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a   was originally.
d870: 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20    ** an INTEGER 
d880: 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c  PRIMARY KEY tabl
d890: 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  e, create a new 
d8a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
d8b0: 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x. .  */.  if( p
d8c0: 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b  Tab->iPKey>=0 ){
d8d0: 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
d8e0: 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20  List;.    pList 
d8f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
d900: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
d910: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
d920: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
d930: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
d940: 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
d950: 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
d960: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
d990: 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
d9a0: 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
d9b0: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
d9c0: 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65  rtOrder = pParse
d9d0: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a  ->iPkSortOrder;.
d9e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
d9f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70  se->pNewTable==p
da00: 54 61 62 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d  Tab );.    pPk =
da10: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
da20: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
da30: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62  , 0, pList, pTab
da40: 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c  ->keyConf, 0, 0,
da50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
da60: 70 50 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pPk==0 ) return;
da70: 0a 20 20 20 20 70 50 6b 2d 3e 69 64 78 54 79 70  .    pPk->idxTyp
da80: 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59  e = SQLITE_IDXTY
da90: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  PE_PRIMARYKEY;. 
daa0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
dab0: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
dac0: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
dad0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
dae0: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d  Tab);.  }.  pPk-
daf0: 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
db00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d  .  assert( pPk!=
db10: 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b  0 );.  nPk = pPk
db20: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a  ->nKeyCol;..  /*
db30: 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
db40: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50   column of the P
db50: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 4e 4f  RIMARY KEY is NO
db60: 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28  T NULL */.  for(
db70: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
db80: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  {.    pTab->aCol
db90: 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  [pPk->aiColumn[i
dba0: 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a  ]].notNull = 1;.
dbb0: 20 20 7d 0a 20 20 70 50 6b 2d 3e 75 6e 69 71 4e    }.  pPk->uniqN
dbc0: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 0a 20 20 2f  otNull = 1;..  /
dbd0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
dbe0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
dbf0: 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  EY is the table 
dc00: 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70  root page */.  p
dc10: 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d  Pk->tnum = pTab-
dc20: 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64  >tnum;..  /* Upd
dc30: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
dc40: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
dc50: 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69   of all UNIQUE i
dc60: 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72  ndices by conver
dc70: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69  ting.  ** the fi
dc80: 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  nal rowid column
dc90: 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   into one or mor
dca0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
dcb0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20   PRIMARY KEY..  
dcc0: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
dcd0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
dce0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
dcf0: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  xt){.    int n;.
dd00: 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
dd10: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
dd20: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
dd30: 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b  for(i=n=0; i<nPk
dd40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
dd50: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
dd60: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
dd70: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
dd80: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20  >aiColumn[i]) ) 
dd90: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n++;.    }.    i
dda0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
ddb0: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
ddc0: 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20  s a superset of 
ddd0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
dde0: 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e  */.      pIdx->n
ddf0: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e  Column = pIdx->n
de00: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  KeyCol;.      co
de10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
de20: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
de30: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
de40: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
de50: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
de60: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
de70: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
de80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
de90: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
dea0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
deb0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
dec0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
ded0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
dee0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
def0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
df00: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
df10: 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
df20: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
df30: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
df40: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
df50: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
df60: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
df70: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
df80: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
df90: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
dfa0: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
dfb0: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
dfc0: 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
dfd0: 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e    if( nPk<pTab->
dfe0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  nCol ){.    if( 
dff0: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
e000: 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d  t(db, pPk, pTab-
e010: 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b  >nCol) ) return;
e020: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e030: 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  nPk; i<pTab->nCo
e040: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
e050: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50  f( !hasColumn(pP
e060: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
e070: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i) ){.        as
e080: 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f  sert( j<pPk->nCo
e090: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
e0a0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
e0b0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50   = i;.        pP
e0c0: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22  k->azColl[j] = "
e0d0: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
e0e0: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e0f0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e100: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
e110: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e120: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
e130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
e140: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
e150: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
e160: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e170: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
e180: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
e190: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
e1a0: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
e1b0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
e1c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
e1d0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
e1e0: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
e1f0: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
e200: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
e210: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
e220: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
e230: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
e240: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
e250: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
e260: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
e270: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
e280: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
e290: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
e2a0: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
e2b0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
e2c0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
e2d0: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
e2e0: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
e2f0: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
e300: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
e310: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
e320: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
e330: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
e340: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
e350: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
e360: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
e370: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
e380: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
e390: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
e3a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
e3b0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
e3c0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
e3d0: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
e3e0: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
e3f0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
e400: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
e410: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
e420: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
e430: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
e440: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
e450: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
e460: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
e470: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
e480: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
e490: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
e4a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
e4b0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
e4c0: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
e4d0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
e4e0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
e4f0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
e500: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e510: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
e520: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
e530: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
e540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e550: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
e560: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
e570: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
e580: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
e590: 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62      /* The ')' b
e5a0: 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e  efore options in
e5b0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
e5c0: 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74  E */.  u8 tabOpt
e5d0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
e5e0: 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70  * Extra table op
e5f0: 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30  tions. Usually 0
e600: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  . */.  Select *p
e610: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
e620: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
e630: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
e640: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
e650: 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20  able *p;        
e660: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e670: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
e680: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e690: 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
e6a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e6b0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
e6c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e6d0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
e6e0: 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c  n which the tabl
e6f0: 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64  e lives */.  Ind
e700: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
e710: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70         /* An imp
e720: 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68  lied index of th
e730: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  e table */..  if
e740: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
e750: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62 2d  elect==0) || db-
e760: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e770: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e780: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
e790: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
e7a0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
e7b0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
e7c0: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
e7d0: 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  lect );..  /* If
e7e0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
e7f0: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
e800: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
e810: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
e820: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
e830: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
e840: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
e850: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
e860: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
e870: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
e880: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
e890: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
e8a0: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
e8b0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
e8c0: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
e8d0: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
e8e0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
e8f0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
e900: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
e910: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
e920: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
e930: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
e940: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
e950: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
e960: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
e970: 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  Special processi
e980: 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ng for WITHOUT R
e990: 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20  OWID Tables */. 
e9a0: 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54   if( tabOpts & T
e9b0: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
e9c0: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  {.    if( (p->ta
e9d0: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
e9e0: 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20  increment) ){.  
e9f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ea00: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
ea10: 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45        "AUTOINCRE
ea20: 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  MENT not allowed
ea30: 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49   on WITHOUT ROWI
ea40: 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  D tables");.    
ea50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
ea60: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
ea70: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
ea80: 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20  maryKey)==0 ){. 
ea90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
eaa0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52  rMsg(pParse, "PR
eab0: 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e  IMARY KEY missin
eac0: 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20  g on table %s", 
ead0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  p->zName);.    }
eae0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74  else{.      p->t
eaf0: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69  abFlags |= TF_Wi
eb00: 74 68 6f 75 74 52 6f 77 69 64 3b 0a 20 20 20 20  thoutRowid;.    
eb10: 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f    convertToWitho
eb20: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61  utRowidTable(pPa
eb30: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  rse, p);.    }. 
eb40: 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   }..  iDb = sqli
eb50: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
eb60: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
eb70: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
eb80: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
eb90: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
eba0: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
ebb0: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
ebc0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
ebd0: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
ebe0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
ebf0: 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
ec00: 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65  rse, p, NC_IsChe
ec10: 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b  ck, 0, p->pCheck
ec20: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
ec30: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ec40: 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a  _OMIT_CHECK) */.
ec50: 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
ec60: 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73  he average row s
ec70: 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ize for the tabl
ec80: 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d  e and for all im
ec90: 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f  plied indices */
eca0: 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  .  estimateTable
ecb0: 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28  Width(p);.  for(
ecc0: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
ecd0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
ece0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74  >pNext){.    est
ecf0: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
ed00: 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pIdx);.  }..  /*
ed10: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
ed20: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
ed30: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
ed40: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
ed50: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
ed60: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
ed70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
ed80: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
ed90: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
eda0: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
edb0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
edc0: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
edd0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
ede0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
edf0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
ee00: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
ee10: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
ee20: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
ee30: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
ee40: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
ee50: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
ee60: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
ee70: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
ee80: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
ee90: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
eea0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
eeb0: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
eec0: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
eed0: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
eee0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
eef0: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
ef00: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
ef10: 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n;..    sqlite3V
ef20: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ef30: 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Close, 0);..    
ef40: 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69  /* .    ** Initi
ef50: 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20  alize zType for 
ef60: 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20  the new view or 
ef70: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
ef80: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
ef90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
efa0: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
efb0: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
efc0: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
efd0: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
efe0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
eff0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
f000: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
f010: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
f020: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
f030: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
f040: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
f050: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
f060: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
f070: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
f080: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
f090: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
f0a0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
f0b0: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
f0c0: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
f0d0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
f0e0: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
f0f0: 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74  ble is in regist
f100: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
f110: 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ot..    **.    *
f120: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
f130: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
f140: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
f150: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
f160: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
f170: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
f180: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
f190: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
f1a0: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
f1b0: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
f1c0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f1d0: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
f1e0: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
f1f0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
f200: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
f210: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
f220: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
f230: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
f240: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
f250: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
f260: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
f270: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
f280: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
f290: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
f2a0: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
f2b0: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
f2c0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
f2d0: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
f2e0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
f2f0: 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  st;.      Table 
f300: 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20  *pSelTab;..     
f310: 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
f320: 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
f330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f340: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
f350: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
f360: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
f370: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
f380: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
f390: 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20  _P2ISREG);.     
f3a0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
f3b0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
f3c0: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
f3d0: 64 65 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  dest, SRT_Table,
f3e0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
f3f0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f400: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
f410: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f420: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f430: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Close, 1);.     
f440: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
f450: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
f460: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
f470: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
f480: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
f490: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
f4a0: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
f4b0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
f4c0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
f4d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   );.        p->n
f4e0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
f4f0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Col;.        p->
f500: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
f510: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
f520: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
f530: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
f540: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
f550: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
f560: 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
f570: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
f580: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
f590: 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
f5a0: 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
f5b0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
f5c0: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
f5d0: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
f5e0: 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
f5f0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c  (db, p);.    }el
f600: 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  se{.      Token 
f610: 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73  *pEnd2 = tabOpts
f620: 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73   ? &pParse->sLas
f630: 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20  tToken : pEnd;. 
f640: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
f650: 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65  End2->z - pParse
f660: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
f670: 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32  .      if( pEnd2
f680: 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20  ->z[0]!=';' ) n 
f690: 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20  += pEnd2->n;.   
f6a0: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
f6b0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
f6c0: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
f6d0: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
f6e0: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
f6f0: 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
f700: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
f710: 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
f720: 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
f730: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
f740: 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
f750: 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
f760: 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
f770: 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
f780: 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
f790: 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
f7a0: 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
f7b0: 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f  ollected..    */
f7c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
f7d0: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
f7e0: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
f7f0: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
f800: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
f810: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
f820: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
f830: 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
f840: 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
f850: 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
f860: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
f870: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
f880: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
f890: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
f8a0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
f8b0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
f8c0: 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
f8d0: 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
f8e0: 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
f8f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
f900: 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
f910: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
f920: 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
f930: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
f940: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
f950: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
f960: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
f970: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
f980: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
f990: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
f9a0: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
f9b0: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
f9c0: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
f9d0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62  /.    if( p->tab
f9e0: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
f9f0: 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
fa00: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
fa10: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
fa20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
fa30: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
fa40: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
fa50: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
fa60: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
fa70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
fa80: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
fa90: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
faa0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
fab0: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
fac0: 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
fad0: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
fae0: 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
faf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
fb00: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
fb10: 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
fb20: 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
fb30: 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
fb40: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
fb50: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
fb60: 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
fb70: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
fb80: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
fb90: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e  tbl_name='%q' AN
fba0: 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  D type!='trigger
fbb0: 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  '", p->zName));.
fbc0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
fbd0: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
fbe0: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
fbf0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
fc00: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
fc10: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
fc20: 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  sy ){.    Table 
fc30: 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d  *pOld;.    Schem
fc40: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e  a *pSchema = p->
fc50: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73  pSchema;.    ass
fc60: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
fc70: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
fc80: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
fc90: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
fca0: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
fcb0: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
fcc0: 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  ame, p);.    if(
fcd0: 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61   pOld ){.      a
fce0: 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29  ssert( p==pOld )
fcf0: 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
fd00: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e  t have failed in
fd10: 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28  side HashInsert(
fd20: 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  ) */.      db->m
fd30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
fd40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
fd50: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
fd60: 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
fd70: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
fd80: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
fd90: 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  anges;..#ifndef 
fda0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
fdb0: 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21  RTABLE.    if( !
fdc0: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
fdd0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fde0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
fdf0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e  har *)pParse->sN
fe00: 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20  ameToken.z;.    
fe10: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20    int nName;.   
fe20: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c     assert( !pSel
fe30: 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20  ect && pCons && 
fe40: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66  pEnd );.      if
fe50: 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b  ( pCons->z==0 ){
fe60: 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d  .        pCons =
fe70: 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20   pEnd;.      }. 
fe80: 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e       nName = (in
fe90: 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  t)((const char *
fea0: 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d  )pCons->z - zNam
feb0: 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  e);.      p->add
fec0: 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b  ColOffset = 13 +
fed0: 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72   sqlite3Utf8Char
fee0: 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  Len(zName, nName
fef0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
ff00: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
ff10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
ff20: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  /*.** The parser
ff30: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
ff40: 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ine in order to 
ff50: 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45  create a new VIE
ff60: 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  W.*/.void sqlite
ff70: 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50  3CreateView(.  P
ff80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ff90: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
ffa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
ffb0: 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20  ken *pBegin,    
ffc0: 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
ffd0: 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
ffe0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
fff0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
10000 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  1,     /* The to
10010 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
10020 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
10030 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
10040 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54  pName2,     /* T
10050 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
10060 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
10070 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65  the view */.  Se
10080 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
10090 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
100a0 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
100b0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
100c0 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
100d0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
100e0 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
100f0 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
10100 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
10110 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
10120 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
10130 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
10140 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
10150 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
10160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
10170 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
10180 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
10190 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
101a0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
101b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
101c0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
101d0 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29  pParse->nVar>0 )
101e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
101f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70  orMsg(pParse, "p
10200 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f  arameters are no
10210 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65  t allowed in vie
10220 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ws");.    sqlite
10230 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
10240 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
10250 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
10260 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
10270 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
10280 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20  pName2, isTemp, 
10290 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20  1, 0, noErr);.  
102a0 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
102b0 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
102c0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  0 || pParse->nEr
102d0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
102e0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
102f0 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
10300 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
10310 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
10320 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
10330 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
10340 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
10350 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
10360 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
10370 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
10380 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
10390 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d  Db, "view", pNam
103a0 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
103b0 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78  3FixSelect(&sFix
103c0 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  , pSelect) ){.  
103d0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
103e0 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
103f0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
10400 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61    }..  /* Make a
10410 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74   copy of the ent
10420 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ire SELECT state
10430 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
10440 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a  s the view..  **
10450 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65   This will force
10460 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f   all the Expr.to
10470 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20  ken.z values to 
10480 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  be dynamically. 
10490 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61   ** allocated ra
104a0 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20  ther than point 
104b0 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  to the input str
104c0 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e  ing - which mean
104d0 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79  s that.  ** they
104e0 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66   will persist af
104f0 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ter the current 
10500 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63  sqlite3_exec() c
10510 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a  all returns..  *
10520 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d  /.  p->pSelect =
10530 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
10540 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45  p(db, pSelect, E
10550 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
10560 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10570 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
10580 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
10590 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
105a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
105b0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
105c0 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sy ){.    sqlite
105d0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
105e0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
105f0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
10600 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10610 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
10620 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e  ement.  Make sEn
10630 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20  d point to.  ** 
10640 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20  the end..  */.  
10650 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73  sEnd = pParse->s
10660 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28  LastToken;.  if(
10670 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30   ALWAYS(sEnd.z[0
10680 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b  ]!=0) && sEnd.z[
10690 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73  0]!=';' ){.    s
106a0 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b  End.z += sEnd.n;
106b0 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  .  }.  sEnd.n = 
106c0 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73  0;.  n = (int)(s
106d0 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e  End.z - pBegin->
106e0 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e  z);.  z = pBegin
106f0 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c  ->z;.  while( AL
10700 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c  WAYS(n>0) && sql
10710 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
10720 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
10730 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
10740 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
10750 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
10760 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
10770 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
10780 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
10790 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
107a0 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
107b0 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c  se, 0, &sEnd, 0,
107c0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d   0);.  return;.}
107d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
107e0 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
107f0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10800 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
10810 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
10820 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10830 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
10840 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
10850 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
10860 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
10870 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
10880 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
10890 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
108a0 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
108b0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
108c0 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
108d0 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
108e0 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
108f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
10900 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
10910 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
10920 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
10930 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
10940 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
10950 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
10960 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
10970 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
10980 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
10990 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
109a0 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
109b0 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
109c0 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
109d0 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
109e0 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
109f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10a00 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
10a10 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10a30 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
10a40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
10a50 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
10a60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
10a70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
10a80 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
10a90 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
10aa0 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71  c errors */.  sq
10ab0 6c 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74  lite3_xauth xAut
10ac0 68 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65  h;       /* Save
10ad0 64 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20  d xAuth pointer 
10ae0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  */..  assert( pT
10af0 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
10b00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10b10 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
10b20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
10b30 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
10b40 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  Table) ){.    re
10b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10b60 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  R;.  }.  if( IsV
10b70 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
10b80 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
10b90 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
10ba0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
10bb0 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
10bc0 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
10bd0 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
10be0 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
10bf0 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
10c00 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
10c10 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
10c20 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
10c30 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
10c40 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
10c50 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
10c60 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
10c70 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
10c80 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
10c90 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
10ca0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
10cb0 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
10cc0 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
10cd0 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
10ce0 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
10cf0 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
10d00 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
10d10 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
10d20 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
10d30 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
10d40 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
10d50 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
10d60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
10d70 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61  lly, the error a
10d80 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67  bove is now caug
10d90 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
10da0 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
10db0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f  .  ** But the fo
10dc0 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20  llowing test is 
10dd0 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20  still important 
10de0 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20  as it does come 
10df0 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  up.  ** in the f
10e00 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a  ollowing:.  ** .
10e10 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
10e20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61  TABLE main.ex1(a
10e30 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
10e40 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31  TE TEMP VIEW ex1
10e50 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
10e60 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20  M ex1;.  **     
10e70 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
10e80 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69  mp.ex1;.  */.  i
10e90 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
10ea0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
10eb0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10ec0 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
10ed0 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
10ee0 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
10ef0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
10f00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
10f10 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
10f20 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
10f30 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
10f40 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
10f50 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
10f60 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
10f70 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
10f80 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
10f90 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
10fa0 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
10fb0 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
10fc0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
10fd0 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
10fe0 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
10ff0 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
11000 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
11010 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
11020 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
11030 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
11040 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
11050 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
11060 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
11070 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
11080 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
11090 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
110a0 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
110b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
110c0 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
110d0 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c   );.  pSel = sql
110e0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
110f0 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
11100 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65  t, 0);.  if( pSe
11110 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62  l ){.    u8 enab
11120 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62  leLookaside = db
11130 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
11140 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50  bled;.    n = pP
11150 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20  arse->nTab;.    
11160 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
11170 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
11180 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b  se, pSel->pSrc);
11190 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  .    pTable->nCo
111a0 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e  l = -1;.    db->
111b0 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
111c0 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ed = 0;.#ifndef 
111d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
111e0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41  ORIZATION.    xA
111f0 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b  uth = db->xAuth;
11200 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
11210 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20   0;.    pSelTab 
11220 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
11230 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
11240 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62  e, pSel);.    db
11250 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b  ->xAuth = xAuth;
11260 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54  .#else.    pSelT
11270 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
11280 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
11290 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e  arse, pSel);.#en
112a0 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  dif.    db->look
112b0 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
112c0 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65   enableLookaside
112d0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  ;.    pParse->nT
112e0 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
112f0 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
11300 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
11310 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
11320 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
11330 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
11340 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
11350 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
11360 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
11370 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
11380 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
11390 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
113a0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
113b0 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
113c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
113d0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
113e0 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d  d(db, 0, pTable-
113f0 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
11400 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
11410 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20  ma->schemaFlags 
11420 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  |= DB_UnresetVie
11430 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ws;.    }else{. 
11440 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
11450 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
11460 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
11470 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
11480 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
11490 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
114a0 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  r++;.  }.#endif 
114b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
114c0 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
114d0 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
114e0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
114f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
11500 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
11510 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11520 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
11530 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11540 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
11550 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
11560 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
11570 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
11580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
11590 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
115a0 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
115b0 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
115c0 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
115d0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
115e0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
115f0 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
11600 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
11610 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
11620 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
11630 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
11640 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
11650 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
11660 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
11670 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
11680 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
11690 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
116a0 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
116b0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
116c0 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
116d0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
116e0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70  , pTab);.      p
116f0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
11700 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
11710 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
11720 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
11730 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
11740 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
11750 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
11760 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
11770 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
11780 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
11790 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
117a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
117b0 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
117c0 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
117d0 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
117e0 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
117f0 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
11800 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
11810 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
11820 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
11830 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
11840 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
11850 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
11860 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
11870 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
11880 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
11890 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
118a0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
118b0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
118c0 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
118d0 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
118e0 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
118f0 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
11900 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
11910 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
11920 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
11930 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
11940 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
11950 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
11960 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
11970 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
11980 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
11990 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
119a0 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
119b0 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
119c0 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
119d0 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
119e0 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
119f0 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
11a00 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
11a10 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
11a20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
11a30 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
11a40 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
11a50 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
11a60 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
11a70 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
11a80 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
11a90 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
11aa0 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
11ab0 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
11ac0 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
11ad0 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
11ae0 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
11af0 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
11b00 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
11b10 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11b20 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
11b30 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71  RootPageMoved(sq
11b40 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
11b50 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
11b60 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
11b70 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
11b80 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20  sh *pHash;.  Db 
11b90 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
11ba0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11bb0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
11bc0 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26   0) );.  pDb = &
11bd0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
11be0 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
11bf0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
11c00 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
11c10 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
11c20 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
11c30 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
11c40 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
11c50 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
11c60 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
11c70 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
11c80 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
11c90 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
11ca0 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
11cb0 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
11cc0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
11cd0 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
11ce0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
11cf0 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
11d00 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
11d10 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
11d20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
11d30 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
11d40 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
11d50 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
11d60 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
11d70 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
11d80 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
11d90 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
11da0 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
11db0 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
11dc0 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
11dd0 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
11de0 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
11df0 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
11e00 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
11e10 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
11e20 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
11e30 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
11e40 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
11e50 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
11e60 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
11e70 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
11e80 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
11e90 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
11ea0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
11eb0 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
11ec0 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
11ed0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11ee0 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
11ef0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
11f00 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11f10 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20  se);.  int r1 = 
11f20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11f30 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
11f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11f50 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
11f60 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
11f70 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
11f80 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
11f90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11fa0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
11fb0 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
11fc0 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
11fd0 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
11fe0 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
11ff0 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
12000 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
12010 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
12020 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
12030 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
12040 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
12050 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
12060 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12070 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
12080 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
12090 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
120a0 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
120b0 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
120c0 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
120d0 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
120e0 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
120f0 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
12100 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
12110 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
12120 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
12130 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12140 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
12150 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
12160 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
12170 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
12180 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
12190 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
121a0 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
121b0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
121c0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
121d0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
121e0 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
121f0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
12200 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
12210 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
12220 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
12230 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
12240 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
12250 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
12260 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
12270 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
12280 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
12290 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
122a0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
122b0 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
122c0 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
122d0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
122e0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
122f0 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
12300 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
12310 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
12320 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
12330 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12340 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
12350 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
12360 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
12370 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
12380 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
12390 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
123a0 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
123b0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
123c0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
123d0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
123e0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
123f0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12400 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
12410 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
12420 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
12430 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
12440 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
12450 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12460 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
12470 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
12480 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
12490 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
124a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
124b0 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
124c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
124d0 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
124e0 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
124f0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
12500 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
12510 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
12520 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
12530 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
12540 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
12550 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
12560 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
12570 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
12580 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
12590 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
125a0 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
125b0 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
125c0 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
125d0 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
125e0 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
125f0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
12600 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
12610 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
12620 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
12630 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
12640 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
12650 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
12660 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
12670 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
12680 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
12690 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
126a0 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
126b0 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
126c0 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
126d0 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
126e0 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
126f0 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
12700 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
12710 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
12720 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
12730 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
12740 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
12750 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
12760 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
12770 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
12780 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
12790 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
127a0 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
127b0 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
127c0 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
127d0 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
127e0 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
127f0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
12800 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
12810 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
12820 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
12830 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
12840 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
12850 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
12860 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
12870 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
12880 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
12890 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
128a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
128b0 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
128c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
128d0 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
128e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
128f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12900 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
12910 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
12920 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
12930 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
12940 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
12950 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
12960 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
12970 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
12980 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
12990 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
129a0 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
129b0 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
129c0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
129d0 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
129e0 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
129f0 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
12a00 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
12a10 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
12a20 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
12a30 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
12a40 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
12a50 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
12a60 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
12a70 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
12a80 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
12a90 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ab0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
12ac0 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
12ad0 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
12ae0 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
12af0 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
12b00 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
12b10 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
12b20 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
12b30 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
12b40 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
12b50 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
12b60 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66  [iDb].zName;.  f
12b70 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b  or(i=1; i<=4; i+
12b80 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
12b90 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
12ba0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
12bb0 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
12bc0 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
12bd0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
12be0 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
12bf0 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
12c00 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
12c10 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
12c20 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
12c30 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
12c40 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
12c50 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
12c60 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
12c70 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
12c80 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12c90 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12ca0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
12cb0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12cc0 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
12cd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
12ce0 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
12cf0 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
12d00 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
12d10 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12d20 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
12d30 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
12d40 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
12d50 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
12d60 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12d70 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
12d80 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
12d90 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
12da0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
12db0 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
12dc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12dd0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
12de0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
12df0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12e00 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
12e10 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
12e20 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
12e30 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
12e40 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
12e50 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
12e60 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
12e70 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
12e80 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
12e90 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
12ea0 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
12eb0 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
12ec0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
12ed0 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
12ee0 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
12ef0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
12f00 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
12f10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12f20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
12f30 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
12f40 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
12f50 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
12f60 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
12f70 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
12f80 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
12f90 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
12fa0 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
12fb0 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
12fc0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
12fd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12fe0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
12ff0 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
13000 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
13010 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
13020 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
13030 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
13040 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
13050 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
13060 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
13070 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
13080 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
13090 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
130a0 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
130b0 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
130c0 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
130d0 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
130e0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
130f0 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
13100 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
13110 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
13120 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
13130 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
13140 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
13150 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
13160 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
13170 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
13180 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
13190 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
131a0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
131b0 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
131c0 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
131d0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
131e0 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
131f0 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
13200 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
13210 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
13220 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
13230 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
13240 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
13250 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
13260 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
13270 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
13280 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
13290 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
132a0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
132b0 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
132c0 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
132d0 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
132e0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
132f0 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
13300 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
13310 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
13320 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
13330 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
13340 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
13350 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
13360 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
13370 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
13380 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
13390 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
133a0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
133b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
133c0 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
133d0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
133e0 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
133f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
13400 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
13410 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
13420 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
13430 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
13440 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
13450 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
13460 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
13470 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
13480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13490 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
134a0 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
134b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
134c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
134d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
134e0 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
134f0 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
13500 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
13510 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
13520 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
13530 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
13540 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
13550 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13560 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
13570 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
13580 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
13590 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
135a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
135b0 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
135c0 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
135d0 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
135e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
135f0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
13600 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
13610 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
13620 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
13630 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13640 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
13650 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
13660 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13670 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13680 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
13690 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
136a0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
136b0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
136c0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f  c==1 );.  if( no
136d0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
136e0 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
136f0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
13700 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
13710 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
13720 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
13730 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
13740 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
13750 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
13760 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
13770 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
13780 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
13790 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
137a0 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
137b0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
137c0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
137d0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
137e0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
137f0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
13800 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
13810 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
13820 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
13830 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
13840 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
13850 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
13860 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
13870 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
13880 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
13890 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
138a0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
138b0 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
138c0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
138d0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
138e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
138f0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13900 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
13910 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
13920 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
13930 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
13940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
13950 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13960 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
13970 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
13980 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13990 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
139a0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
139b0 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
139c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
139d0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
139e0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
139f0 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
13a00 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
13a10 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
13a20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
13a30 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
13a40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13a50 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
13a60 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
13a70 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
13a80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13a90 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
13aa0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
13ab0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
13ac0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
13ad0 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
13ae0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
13af0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
13b00 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
13b10 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
13b20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
13b30 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
13b40 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
13b50 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
13b60 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
13b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b80 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
13b90 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
13ba0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13bb0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
13bc0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
13bd0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
13be0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
13bf0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13c00 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
13c10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13c20 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13c30 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
13c40 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
13c50 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
13c60 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13c70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
13c80 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
13c90 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
13ca0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
13cb0 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
13cc0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
13cd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
13ce0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
13cf0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13d00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13d10 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
13d20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
13d30 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13d40 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13d50 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
13d60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13d70 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
13d80 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
13d90 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
13da0 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
13db0 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
13dc0 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
13dd0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
13de0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
13df0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
13e00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13e10 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
13e20 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
13e30 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
13e40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
13e50 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13e60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
13e70 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
13e80 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
13e90 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13ea0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
13eb0 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
13ec0 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
13ed0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
13ee0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
13ef0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13f00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13f10 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
13f20 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
13f30 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
13f40 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
13f50 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13f60 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
13f70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
13f80 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
13f90 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
13fa0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
13fb0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
13fc0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
13fd0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
13fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
13ff0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
14000 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
14010 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
14020 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
14030 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
14040 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
14050 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
14060 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14070 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
14080 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14090 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
140a0 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
140b0 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
140c0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
140d0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
140e0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
140f0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
14100 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
14110 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
14120 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
14130 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
14140 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
14150 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
14160 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
14170 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
14180 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
14190 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
141a0 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
141b0 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
141c0 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
141d0 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
141e0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
141f0 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
14200 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
14210 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
14220 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
14230 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
14240 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
14250 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
14260 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
14270 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
14280 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
14290 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
142a0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
142b0 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
142c0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
142d0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
142e0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
142f0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
14300 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
14310 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
14320 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
14330 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
14340 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
14350 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
14360 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
14370 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
14380 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
14390 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
143a0 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
143b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
143c0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
143d0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
143e0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
143f0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
14400 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
14410 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
14420 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
14430 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
14440 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
14450 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
14460 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
14470 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
14480 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
14490 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
144a0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
144b0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
144c0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
144d0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
144e0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
144f0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
14500 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
14510 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
14520 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
14530 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
14540 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
14550 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
14560 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
14570 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
14580 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
14590 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
145a0 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
145b0 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
145c0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
145d0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
145e0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
145f0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
14600 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
14610 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
14620 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
14630 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
14640 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14650 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
14660 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
14670 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
14680 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
14690 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
146a0 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
146b0 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
146c0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
146d0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
146e0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
146f0 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
14700 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
14710 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
14720 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
14730 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14740 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
14750 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
14760 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
14770 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
14780 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
14790 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
147a0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
147b0 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
147c0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
147d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
147e0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
147f0 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
14800 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
14810 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
14820 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
14830 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
14840 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
14850 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
14860 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
14870 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
14880 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
14890 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
148a0 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
148b0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
148c0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
148d0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
148e0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
148f0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
14900 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
14910 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
14920 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
14930 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
14940 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
14950 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
14960 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
14970 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
14980 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
14990 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
149a0 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
149b0 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
149c0 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
149d0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
149e0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
149f0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
14a00 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
14a10 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
14a20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
14a30 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
14a40 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
14a50 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
14a60 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
14a70 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
14a80 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
14a90 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
14aa0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
14ab0 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
14ac0 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
14ad0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
14ae0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14b00 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
14b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
14b20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
14b30 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
14b40 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
14b50 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
14b60 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
14b70 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
14b80 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
14b90 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
14ba0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
14bb0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
14bc0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
14bd0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
14be0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
14bf0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
14c00 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
14c10 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
14c20 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
14c30 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
14c40 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
14c50 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
14c60 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
14c70 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
14c80 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
14c90 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
14ca0 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
14cb0 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
14cc0 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
14cd0 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
14ce0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
14cf0 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
14d00 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
14d10 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
14d20 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
14d30 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
14d40 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
14d50 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
14d60 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
14d70 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
14d80 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
14d90 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
14da0 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
14db0 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
14dc0 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
14dd0 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
14de0 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d  pFKey ){.    db-
14df0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
14e00 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  1;.    goto fk_e
14e10 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  nd;.  }.  if( pN
14e20 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73  extTo ){.    ass
14e30 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50  ert( pNextTo->pP
14e40 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  revTo==0 );.    
14e50 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
14e60 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e   pNextTo;.    pN
14e70 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d  extTo->pPrevTo =
14e80 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f   pFKey;.  }..  /
14e90 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
14ea0 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
14eb0 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
14ec0 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
14ed0 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
14ee0 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
14ef0 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
14f00 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
14f10 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
14f20 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14f30 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
14f40 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
14f50 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
14f60 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
14f70 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
14f80 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
14f90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14fa0 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
14fb0 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
14fc0 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
14fd0 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
14fe0 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
14ff0 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
15000 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
15010 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
15020 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
15030 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
15040 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
15050 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
15060 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
15070 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
15080 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
15090 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
150a0 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
150b0 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
150c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
150d0 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
150e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
150f0 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
15100 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15110 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
15120 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
15130 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
15140 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
15150 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
15160 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
15170 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
15180 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
15190 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
151a0 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
151b0 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  1 ); /* EV: R-30
151c0 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70  323-21917 */.  p
151d0 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
151e0 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65   = (u8)isDeferre
151f0 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
15200 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15210 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
15220 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
15230 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
15240 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
15250 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
15260 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
15270 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
15280 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
15290 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
152a0 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
152b0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
152c0 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
152d0 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
152e0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
152f0 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
15300 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
15310 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63  he register spec
15320 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
15330 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
15340 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
15350 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
15360 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
15370 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
15380 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
15390 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
153a0 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
153b0 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
153c0 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
153d0 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
153e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
153f0 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
15400 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
15410 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15420 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
15430 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
15440 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
15450 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
15460 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
15470 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
15480 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
15490 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
154a0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
154b0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
154c0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
154d0 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
154e0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
154f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15500 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
15510 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
15520 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
15530 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20  iSorter;        
15540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
15550 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f  rsor opened by O
15560 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e  penSorter (if in
15570 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61   use) */.  int a
15580 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
15590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
155a0 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
155b0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
155c0 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
155d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
155e0 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  ss to jump to fo
155f0 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  r next iteration
15600 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
15630 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
15640 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65  int iPartIdxLabe
15650 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
15660 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c  * Jump to this l
15670 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72  abel to skip a r
15680 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ow */.  Vdbe *v;
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156a0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
156b0 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
156c0 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
156d0 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
156e0 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
156f0 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
15700 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
15710 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15730 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
15740 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64  ng assembled ind
15750 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
15760 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
15770 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a  rse->db;      /*
15780 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
15790 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
157a0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
157b0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
157c0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
157d0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
157e0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
157f0 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
15800 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
15810 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
15820 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
15830 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d  me, 0,.      db-
15840 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
15850 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
15860 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15870 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
15880 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
15890 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
158a0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
158b0 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
158c0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
158d0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
158e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
158f0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
15900 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
15910 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
15920 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
15930 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e  age>=0 ){.    tn
15940 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65  um = memRootPage
15950 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
15960 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
15970 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  um;.  }.  pKey =
15980 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
15990 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
159a0 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70  Index);..  /* Op
159b0 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75  en the sorter cu
159c0 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74  rsor if we are t
159d0 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  o use one. */.  
159e0 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65  iSorter = pParse
159f0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
15a00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15a10 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
15a20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64  iSorter, 0, pInd
15a30 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68  ex->nKeyCol, (ch
15a40 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20  ar*).           
15a50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15a60 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29  KeyInfoRef(pKey)
15a70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
15a80 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61    /* Open the ta
15a90 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ble. Loop throug
15aa0 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  h all rows of th
15ab0 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69  e table, inserti
15ac0 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65  ng index.  ** re
15ad0 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73  cords into the s
15ae0 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69  orter. */.  sqli
15af0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
15b00 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
15b10 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
15b20 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
15b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15b40 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
15b50 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  ab, 0); VdbeCove
15b60 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65  rage(v);.  regRe
15b70 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
15b80 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15b90 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  ;..  sqlite3Gene
15ba0 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
15bb0 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c  rse,pIndex,iTab,
15bc0 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61  regRecord,0,&iPa
15bd0 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b  rtIdxLabel,0,0);
15be0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15bf0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
15c00 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
15c10 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
15c20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
15c30 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
15c40 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
15c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15c60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
15c70 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
15c80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15c90 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
15ca0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
15cb0 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
15cc0 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
15cd0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15ce0 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
15cf0 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
15d00 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15d10 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
15d20 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
15d50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
15d60 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15d70 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  5(v, OPFLAG_BULK
15d80 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67  CSR|((memRootPag
15d90 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49  e>=0)?OPFLAG_P2I
15da0 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64  SREG:0));..  add
15db0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
15dc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
15dd0 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
15de0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
15df0 67 65 28 76 29 3b 0a 20 20 61 73 73 65 72 74 28  ge(v);.  assert(
15e00 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
15e10 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
15e20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
15e30 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
15e40 64 65 78 28 70 49 6e 64 65 78 29 20 26 26 20 70  dex(pIndex) && p
15e50 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Key!=0 ){.    in
15e60 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
15e70 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15e80 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 3;.    sqlite
15e90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15ea0 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a  P_Goto, 0, j2);.
15eb0 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
15ec0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15ed0 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
15ee0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
15ef0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  v, OP_SorterComp
15f00 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32  are, iSorter, j2
15f10 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20  , regRecord,.   
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b        pIndex->nK
15f40 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
15f50 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
15f60 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
15f70 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f  aint(pParse, OE_
15f80 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a  Abort, pIndex);.
15f90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
15fa0 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
15fb0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15fc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15fd0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
15fe0 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65  rterData, iSorte
15ff0 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49  r, regRecord, iI
16000 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
16010 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
16020 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
16030 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20  regRecord, 1);. 
16040 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16050 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
16060 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
16070 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16080 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16090 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
160a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
160b0 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
160c0 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29   iSorter, addr2)
160d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
160e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
160f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16100 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
16110 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
16120 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
16130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16140 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
16150 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
16160 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
16170 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
16180 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
16190 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
161a0 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
161b0 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
161c0 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
161d0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
161e0 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
161f0 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
16200 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
16210 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
16220 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
16230 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
16240 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
16250 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
16260 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
16270 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
16280 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
16290 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
162a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
162b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
162c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
162d0 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
162e0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
162f0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
16300 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
16310 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
16320 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16330 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
16340 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
16350 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
16360 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
16370 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
16380 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
16390 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
163a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
163b0 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
163c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
163d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
163e0 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
163f0 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
16400 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
16410 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
16420 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
16430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16440 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
16450 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
16460 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
16470 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
16480 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
16490 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
164a0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
164b0 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
164c0 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ) +     /* Index
164d0 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a  .aiRowLogEst   *
164e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
164f0 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e     sizeof(i16)*n
16500 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
16510 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
16520 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mn   */.        
16530 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
16540 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20  u8)*nCol);      
16550 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
16560 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
16570 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
16580 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
16590 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  e + nExtra);.  i
165a0 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
165b0 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61   *pExtra = ((cha
165c0 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)+ROUND8(siz
165d0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
165e0 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68   p->azColl = (ch
165f0 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 20 20 20  ar**)pExtra;    
16600 20 20 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55     pExtra += ROU
16610 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
16620 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  )*nCol);.    p->
16630 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c  aiRowLogEst = (L
16640 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70  ogEst*)pExtra; p
16650 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
16660 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
16670 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d  ;.    p->aiColum
16680 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61  n = (i16*)pExtra
16690 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b  ;       pExtra +
166a0 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43  = sizeof(i16)*nC
166b0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74  ol;.    p->aSort
166c0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78  Order = (u8*)pEx
166d0 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  tra;.    p->nCol
166e0 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  umn = nCol;.    
166f0 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f  p->nKeyCol = nCo
16700 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78  l - 1;.    *ppEx
16710 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
16720 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20   + nByte;.  }.  
16730 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
16740 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
16750 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
16760 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
16770 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
16780 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
16790 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
167a0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
167b0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
167c0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
167d0 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
167e0 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
167f0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
16800 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
16810 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
16820 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
16830 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
16840 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
16850 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
16860 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
16870 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
16880 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
16890 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
168a0 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
168b0 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
168c0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
168d0 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
168e0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
168f0 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
16900 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
16910 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
16920 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
16930 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
16940 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
16950 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
16960 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
16970 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
16980 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
16990 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
169a0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
169b0 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  n.  .**.** If th
169c0 65 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  e index is creat
169d0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
169e0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
169f0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64  r to the new Ind
16a00 65 78 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ex.** structure.
16a10 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
16a20 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
16a30 72 79 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20  ryKey() to mark 
16a40 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20  the index.** as 
16a50 74 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61  the tables prima
16a60 72 79 20 6b 65 79 20 28 49 6e 64 65 78 2e 69 64  ry key (Index.id
16a70 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
16a80 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
16a90 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ).*/.Index *sqli
16aa0 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
16ab0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16ac0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
16ad0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
16ae0 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
16af0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
16b00 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
16b10 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
16b20 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
16b30 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
16b40 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
16b50 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
16b60 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
16b70 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
16b80 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
16b90 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
16ba0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
16bb0 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
16bc0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
16bd0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
16be0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
16bf0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
16c00 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
16c10 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
16c20 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
16c30 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
16c40 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
16c50 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
16c60 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73  that begins this
16c70 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
16c80 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20  Expr *pPIWhere, 
16c90 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
16ca0 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69  se for partial i
16cb0 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
16cc0 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
16cd0 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
16ce0 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
16cf0 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
16d00 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
16d10 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72       /* Omit err
16d20 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
16d30 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
16d40 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20 3d  .  Index *pRet =
16d50 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74   0;     /* Point
16d60 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  er to return */.
16d70 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
16d80 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
16d90 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
16da0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
16db0 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
16dc0 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
16dd0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
16de0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
16df0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
16e00 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
16e10 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
16e20 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
16e30 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
16e40 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62    int i, j;.  Db
16e50 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
16e60 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
16e70 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
16e80 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
16e90 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
16ea0 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
16eb0 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
16ec0 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
16ed0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
16ee0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
16ef0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
16f00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
16f10 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
16f20 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
16f30 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
16f40 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
16f50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16f60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16f70 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
16f80 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
16f90 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
16fa0 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
16fb0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
16fc0 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
16fd0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
16fe0 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
16ff0 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
17000 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
17010 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70   const Column *p
17020 54 61 62 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  TabCol;         
17030 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 69 6e    /* A column in
17040 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
17050 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20  int nExtra = 0; 
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
17080 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d  ted for zExtra[]
17090 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
170a0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
170b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
170c0 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e   of extra column
170d0 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68  s needed */.  ch
170e0 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20  ar *zExtra = 0; 
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17100 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61 66  * Extra space af
17110 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
17120 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ject */.  Index 
17130 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f  *pPk = 0;      /
17140 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  * PRIMARY KEY in
17150 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20  dex for WITHOUT 
17160 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a  ROWID tables */.
17170 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
17180 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
17190 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
171a0 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72  ed with prior er
171b0 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  rors */.  if( db
171c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
171d0 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
171e0 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  B ){.    goto ex
171f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17200 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
17210 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
17220 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
17230 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
17240 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17250 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
17260 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
17270 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
17280 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
17290 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
172a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
172b0 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
172c0 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
172d0 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
172e0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
172f0 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
17300 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
17310 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
17320 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
17330 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
17340 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
17350 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
17360 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17370 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
17380 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
17390 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
173a0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
173b0 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
173c0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
173d0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
173e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
173f0 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
17400 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
17410 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17420 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
17430 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
17440 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
17450 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
17460 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
17470 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
17480 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
17490 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
174a0 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
174b0 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
174c0 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
174d0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
174e0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
174f0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
17500 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
17510 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
17520 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
17530 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
17540 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
17550 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
17560 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
17570 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
17580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
17590 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
175a0 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
175b0 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
175c0 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
175d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
175e0 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
175f0 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
17600 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
17610 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
17620 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
17630 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
17640 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
17650 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
17660 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
17670 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
17680 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
17690 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
176a0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
176b0 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
176c0 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
176d0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
176e0 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
176f0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
17700 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
17710 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17720 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
17730 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
17740 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
17750 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
17760 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17770 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
17780 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
17790 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
177a0 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
177b0 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
177c0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
177d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
177e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
177f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
17800 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
17810 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
17820 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
17830 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
17840 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
17850 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
17860 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
17870 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
17880 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
17890 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
178a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
178b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
178c0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
178d0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
178e0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
178f0 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
17900 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
17910 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
17920 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
17930 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
17940 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
17950 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
17960 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
17970 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
17980 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
17990 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
179a0 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
179b0 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
179c0 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
179d0 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  me)==0.#endif.  
179e0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
179f0 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a  trNICmp(&pTab->z
17a00 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61  Name[7],"alterta
17a10 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20  b_",9)!=0 ){.   
17a20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17a30 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
17a40 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
17a50 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
17a60 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
17a70 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17a80 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
17a90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
17aa0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
17ab0 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
17ac0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17ad0 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
17ae0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
17af0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17b00 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
17b10 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
17b20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
17b30 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
17b40 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
17b50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17b60 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
17b70 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
17b80 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
17b90 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17ba0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17bb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
17bc0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
17bd0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
17be0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
17bf0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
17c00 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
17c10 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
17c20 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
17c30 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
17c40 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
17c50 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
17c60 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
17c70 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
17c80 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
17c90 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
17ca0 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
17cb0 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
17cc0 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
17cd0 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
17ce0 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
17cf0 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
17d00 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
17d10 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
17d20 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
17d30 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
17d40 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
17d50 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
17d60 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
17d70 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
17d80 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
17d90 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
17da0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
17db0 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
17dc0 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
17dd0 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
17de0 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
17df0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
17e00 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
17e10 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
17e20 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
17e30 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17e40 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
17e50 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
17e60 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
17e70 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
17e80 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
17e90 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
17ea0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17eb0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17ec0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
17ed0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
17ee0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
17ef0 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
17f00 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
17f10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17f20 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
17f30 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
17f40 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
17f50 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
17f60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17f70 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
17f80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
17f90 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
17fa0 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
17fb0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
17fc0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
17fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17fe0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17ff0 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
18000 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
18010 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
18020 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
18030 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
18040 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sy );.        sq
18050 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
18060 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
18070 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
18080 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18090 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
180a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
180b0 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
180c0 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
180d0 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
180e0 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
180f0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
18100 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
18110 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
18120 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
18130 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
18140 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
18150 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
18160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
18170 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18180 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dex;.    }.  }..
18190 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
181a0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
181b0 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
181c0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
181d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
181e0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
181f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
18200 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
18210 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
18220 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18230 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
18240 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
18250 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
18260 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18270 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18280 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
18290 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
182a0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
182b0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
182c0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
182d0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
182e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
182f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
18300 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
18310 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
18320 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18330 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18340 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18350 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
18360 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
18370 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
18380 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
18390 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
183a0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
183b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
183c0 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
183d0 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
183e0 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
183f0 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
18400 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
18410 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
18420 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
18430 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
18440 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  arse, 0, 0);.   
18450 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
18460 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18470 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73  _index;.    pLis
18480 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[0].zName = 
18490 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
184a0 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
184b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184d0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
184e0 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
184f0 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  me);.    pList->
18500 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
18510 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a   (u8)sortOrder;.
18520 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
18530 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
18540 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
18550 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
18560 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
18570 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
18580 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18590 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
185a0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
185b0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
185c0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
185d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
185e0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20  ;.    if( pExpr 
185f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18600 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
18610 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
18620 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73  nExtra += (1 + s
18630 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
18640 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29  Expr->u.zToken))
18650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18660 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
18670 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
18680 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
18690 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
186a0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
186b0 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20  nExtraCol = pPk 
186c0 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a  ? pPk->nKeyCol :
186d0 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   1;.  pIndex = s
186e0 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
186f0 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c  dexObject(db, pL
18700 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78  ist->nExpr + nEx
18710 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  traCol,.        
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e                nN
18740 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31  ame + nExtra + 1
18750 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66  , &zExtra);.  if
18760 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
18770 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
18780 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18790 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
187a0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
187b0 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52  MENT(pIndex->aiR
187c0 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61  owLogEst) );.  a
187d0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
187e0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
187f0 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20  ex->azColl) );. 
18800 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
18810 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72   zExtra;.  zExtr
18820 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a  a += nName + 1;.
18830 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
18840 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
18850 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
18860 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
18870 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
18880 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
18890 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69  r;.  pIndex->uni
188a0 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  qNotNull = onErr
188b0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70  or!=OE_None;.  p
188c0 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d  Index->idxType =
188d0 20 70 4e 61 6d 65 20 3f 20 53 51 4c 49 54 45 5f   pName ? SQLITE_
188e0 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 3a  IDXTYPE_APPDEF :
188f0 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
18900 55 4e 49 51 55 45 3b 0a 20 20 70 49 6e 64 65 78  UNIQUE;.  pIndex
18910 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
18920 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
18930 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ;.  pIndex->nKey
18940 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Col = pList->nEx
18950 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65  pr;.  if( pPIWhe
18960 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
18970 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
18980 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54  rence(pParse, pT
18990 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20  ab, NC_PartIdx, 
189a0 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  pPIWhere, 0);.  
189b0 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49    pIndex->pPartI
189c0 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65  dxWhere = pPIWhe
189d0 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65  re;.    pPIWhere
189e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
189f0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
18a00 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
18a10 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  Db, 0) );..  /* 
18a20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
18a30 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20  we should honor 
18a40 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e  DESC requests on
18a50 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20   index columns. 
18a60 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70   */.  if( pDb->p
18a70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
18a80 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f  mat>=4 ){.    so
18a90 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31  rtOrderMask = -1
18aa0 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53  ;   /* Honor DES
18ab0 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  C */.  }else{.  
18ac0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
18ad0 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72  = 0;    /* Ignor
18ae0 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20  e DESC */.  }.. 
18af0 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
18b00 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
18b10 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
18b20 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
18b30 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
18b40 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
18b50 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
18b60 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
18b70 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
18b80 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
18b90 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  ot found..  **. 
18ba0 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61   ** TODO:  Add a
18bb0 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   test to make su
18bc0 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  re that the same
18bd0 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e   column is not n
18be0 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74  amed.  ** more t
18bf0 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
18c00 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
18c10 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
18c20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a  instance of.  **
18c30 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c   the column will
18c40 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79   ever be used by
18c50 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
18c60 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67   Note that using
18c70 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63   the.  ** same c
18c80 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20  olumn more than 
18c90 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  once cannot be a
18ca0 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
18cb0 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  that would .  **
18cc0 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73   break backwards
18cd0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
18ce0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
18cf0 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  a warning..  */.
18d00 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
18d10 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
18d20 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
18d30 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
18d40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
18d50 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69   *zColName = pLi
18d60 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  stItem->zName;. 
18d70 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64     int requested
18d80 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63  SortOrder;.    c
18d90 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18db0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
18dc0 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  nce name */..   
18dd0 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f   for(j=0, pTabCo
18de0 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c  l=pTab->aCol; j<
18df0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
18e00 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
18e10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
18e20 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20  rICmp(zColName, 
18e30 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d  pTabCol->zName)=
18e40 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
18e50 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
18e60 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
18e70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18e80 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
18e90 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %s has no column
18ea0 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
18eb0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
18ec0 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   zColName);.    
18ed0 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
18ee0 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
18ef0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18f00 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18f10 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78     assert( j<=0x
18f20 37 66 66 66 20 29 3b 0a 20 20 20 20 70 49 6e 64  7fff );.    pInd
18f30 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
18f40 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 69 66  = (i16)j;.    if
18f50 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
18f60 70 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  pr ){.      int 
18f70 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61 73 73  nColl;.      ass
18f80 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e  ert( pListItem->
18f90 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
18fa0 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 7a  LLATE );.      z
18fb0 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
18fc0 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ->pExpr->u.zToke
18fd0 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d  n;.      nColl =
18fe0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
18ff0 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20  (zColl) + 1;.   
19000 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
19010 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  a>=nColl );.    
19020 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
19030 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a   zColl, nColl);.
19040 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
19050 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74  xtra;.      zExt
19060 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra += nColl;.   
19070 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f     nExtra -= nCo
19080 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
19090 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
190a0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
190b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f  ;.      if( !zCo
190c0 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49  ll ) zColl = "BI
190d0 4e 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20 20 20  NARY";.    }.   
190e0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
190f0 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c  usy && !sqlite3L
19100 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
19110 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
19120 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19130 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19140 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
19150 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
19160 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
19170 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
19180 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
19190 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
191a0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
191b0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38  rtOrder[i] = (u8
191c0 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72  )requestedSortOr
191d0 64 65 72 3b 0a 20 20 20 20 69 66 28 20 70 54 61  der;.    if( pTa
191e0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
191f0 6c 6c 3d 3d 30 20 29 20 70 49 6e 64 65 78 2d 3e  ll==0 ) pIndex->
19200 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  uniqNotNull = 0;
19210 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6b 20 29  .  }.  if( pPk )
19220 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
19230 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
19240 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  ++){.      int x
19250 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
19260 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 68  [j];.      if( h
19270 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d  asColumn(pIndex-
19280 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65  >aiColumn, pInde
19290 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29  x->nKeyCol, x) )
192a0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
192b0 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20  ->nColumn--; .  
192c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
192d0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
192e0 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20  umn[i] = x;.    
192f0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
19300 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[i] = pPk->azC
19310 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
19320 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
19330 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f  er[i] = pPk->aSo
19340 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
19350 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
19360 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19370 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  t( i==pIndex->nC
19380 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65  olumn );.  }else
19390 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  {.    pIndex->ai
193a0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 2d 31 3b 0a  Column[i] = -1;.
193b0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
193c0 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[i] = "BINARY"
193d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
193e0 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
193f0 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
19400 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
19410 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
19420 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
19430 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
19440 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
19450 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
19460 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
19470 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
19480 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
19490 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
194a0 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
194b0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
194c0 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
194d0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
194e0 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
194f0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
19500 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
19510 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
19520 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
19530 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
19540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
19550 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
19560 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
19570 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
19580 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
19590 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
195a0 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
195b0 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
195c0 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
195d0 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
195e0 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
195f0 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
19600 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
19610 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
19620 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
19630 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
19640 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
19650 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
19660 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
19670 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
19680 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
19690 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
196a0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
196b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
196c0 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
196d0 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
196e0 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
196f0 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
19700 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
19710 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
19720 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
19730 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
19740 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
19750 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
19760 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
19770 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
19780 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
19790 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
197a0 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
197b0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
197c0 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
197d0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
197e0 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
197f0 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
19800 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
19810 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
19820 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
19830 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
19840 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
19850 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
19860 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
19870 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
19880 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20  (pIdx) );.      
19890 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64  assert( pIdx->id
198a0 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
198b0 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a  XTYPE_APPDEF );.
198c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
198d0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
198e0 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  ex) );..      if
198f0 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21  ( pIdx->nKeyCol!
19900 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  =pIndex->nKeyCol
19910 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19920 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
19930 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b  dx->nKeyCol; k++
19940 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
19950 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20   char *z1;.     
19960 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19970 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  2;.        if( p
19980 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
19990 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
199a0 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
199b0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78         z1 = pIdx
199c0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
199d0 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78       z2 = pIndex
199e0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
199f0 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20       if( z1!=z2 
19a00 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
19a10 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61  p(z1, z2) ) brea
19a20 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
19a30 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b   if( k==pIdx->nK
19a40 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
19a50 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
19a60 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
19a70 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
19a80 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
19a90 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
19aa0 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
19ab0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
19ac0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
19ad0 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
19ae0 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
19af0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
19b00 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
19b10 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
19b20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
19b30 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
19b40 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
19b50 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
19b60 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
19b70 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
19b80 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
19b90 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
19ba0 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
19bb0 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
19bc0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
19bd0 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
19be0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
19bf0 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
19c00 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20  ed behavior for 
19c10 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
19c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19c30 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
19c40 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
19c50 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
19c60 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
19c70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
19c80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19c90 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
19ca0 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
19cb0 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
19cc0 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
19cd0 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
19ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
19cf0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
19d00 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
19d10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
19d20 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
19d30 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
19d40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
19d60 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19d70 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
19d80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e   }.  }..  /* Lin
19d90 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20  k the new Index 
19da0 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
19db0 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68   table and to th
19dc0 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d  e other.  ** in-
19dd0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
19de0 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a  structures. .  *
19df0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
19e00 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
19e10 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72  ex *p;.    asser
19e20 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
19e30 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
19e40 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
19e50 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
19e60 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
19e70 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
19e80 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ea0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
19eb0 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  me, pIndex);.   
19ec0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
19ed0 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
19ee0 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
19ef0 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
19f00 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   */.      db->ma
19f10 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
19f20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
19f30 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19f40 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
19f50 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
19f60 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
19f70 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
19f80 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
19f90 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
19fa0 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
19fb0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
19fc0 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
19fd0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
19fe0 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54  tement (or CREAT
19ff0 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20  E TABLE if the. 
1a000 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20   ** index is an 
1a010 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f  implied index fo
1a020 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52  r a UNIQUE or PR
1a030 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1a040 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20  aint) then.  ** 
1a050 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c  emit code to all
1a060 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1a070 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b  rootpage on disk
1a080 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74   and make an ent
1a090 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  ry for.  ** the 
1a0a0 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c  index in the sql
1a0b0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
1a0c0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68   and populate th
1a0d0 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a  e index with.  *
1a0e0 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c  * content.  But,
1a0f0 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
1a100 69 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79  if we are simply
1a110 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
1a120 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
1a130 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74  table to parse t
1a140 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66  he schema, or if
1a150 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74   this index is t
1a160 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
1a170 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57  ndex.  ** of a W
1a180 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1a190 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
1a1a0 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
1a1b0 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
1a1c0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
1a1d0 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d   an implied PRIM
1a1e0 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20  ARY KEY.  ** or 
1a1f0 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20  UNIQUE index in 
1a200 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
1a210 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
1a220 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
1a230 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
1a240 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
1a250 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
1a260 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
1a270 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
1a280 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
1a290 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
1a2a0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
1a2b0 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
1a2c0 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  Tab) || pTblName
1a2d0 21 3d 30 29 20 29 7b 0a 20 20 20 20 56 64 62 65  !=0) ){.    Vdbe
1a2e0 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
1a2f0 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d  Stmt;.    int iM
1a300 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
1a310 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  Mem;..    v = sq
1a320 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1a330 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
1a340 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1a350 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20  reate_index;... 
1a360 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
1a370 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
1a380 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  e index.    */. 
1a390 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1a3a0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1a3b0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
1a3c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a3d0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
1a3e0 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65  eIndex, iDb, iMe
1a3f0 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  m);..    /* Gath
1a400 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
1a410 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
1a420 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1a430 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
1a440 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
1a450 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
1a460 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
1a470 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70   int n = (int)(p
1a480 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
1a490 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20  n.z - pName->z) 
1a4a0 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  + pParse->sLastT
1a4b0 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66  oken.n;.      if
1a4c0 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d  ( pName->z[n-1]=
1a4d0 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20  =';' ) n--;.    
1a4e0 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64    /* A named ind
1a4f0 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69  ex with an expli
1a500 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58  cit CREATE INDEX
1a510 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
1a520 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69      zStmt = sqli
1a530 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1a540 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25  CREATE%s INDEX %
1a550 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e  .*s",.        on
1a560 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
1a570 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
1a580 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20   n, pName->z);. 
1a590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a5a0 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20  /* An automatic 
1a5b0 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79  index created by
1a5c0 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1a5d0 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
1a5e0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
1a5f0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1a600 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20  Printf(""); */. 
1a610 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
1a620 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
1a630 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71  d an entry in sq
1a640 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20  lite_master for 
1a650 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a  this index.    *
1a660 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  /.    sqlite3Nes
1a670 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1a680 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52   .        "INSER
1a690 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
1a6a0 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
1a6b0 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
1a6c0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1a6d0 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ].zName, SCHEMA_
1a6e0 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20  TABLE(iDb),.    
1a6f0 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
1a700 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e,.        pTab-
1a710 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
1a720 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53  iMem,.        zS
1a730 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tmt.    );.    s
1a740 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a750 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a   zStmt);..    /*
1a760 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20   Fill the index 
1a770 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65  with data and re
1a780 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61  parse the schema
1a790 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70  . Code an OP_Exp
1a7a0 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e  ire.    ** to in
1a7b0 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
1a7c0 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
1a7d0 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
1a7e0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
1a7f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a800 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
1a810 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b  , pIndex, iMem);
1a820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
1a830 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1a840 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  e, iDb);.      s
1a850 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
1a860 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44  seSchemaOp(v, iD
1a870 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  b,.         sqli
1a880 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1a890 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
1a8a0 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e  pe='index'", pIn
1a8b0 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
1a8c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a8d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69  ddOp1(v, OP_Expi
1a8e0 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  re, 0);.    }.  
1a8f0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64  }..  /* When add
1a900 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ing an index to 
1a910 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69  the list of indi
1a920 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c  ces for a table,
1a930 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20   make.  ** sure 
1a940 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65  all indices labe
1a950 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63  led OE_Replace c
1a960 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68  ome after all th
1a970 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a  ose labeled.  **
1a980 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69   OE_Ignore.  Thi
1a990 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66  s is necessary f
1a9a0 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  or the correct c
1a9b0 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a  onstraint check.
1a9c0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1a9d0 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72  (in sqlite3Gener
1a9e0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65  ateConstraintChe
1a9f0 63 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f  cks()) as part o
1aa00 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e  f.  ** UPDATE an
1aa10 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
1aa20 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66  nts.  .  */.  if
1aa30 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1aa40 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29  || pTblName==0 )
1aa50 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f  {.    if( onErro
1aa60 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c  r!=OE_Replace ||
1aa70 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30   pTab->pIndex==0
1aa80 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61  .         || pTa
1aa90 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  b->pIndex->onErr
1aaa0 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b  or==OE_Replace){
1aab0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1aac0 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e  Next = pTab->pIn
1aad0 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  dex;.      pTab-
1aae0 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
1aaf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ab00 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72     Index *pOther
1ab10 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1ab20 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f  .      while( pO
1ab30 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70  ther->pNext && p
1ab40 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e  Other->pNext->on
1ab50 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1ab60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74  e ){.        pOt
1ab70 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  her = pOther->pN
1ab80 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1ab90 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1aba0 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1abb0 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e  ;.      pOther->
1abc0 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a  pNext = pIndex;.
1abd0 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d      }.    pRet =
1abe0 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e   pIndex;.    pIn
1abf0 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
1ac00 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
1ac10 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
1ac20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
1ac30 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20  .  if( pIndex ) 
1ac40 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
1ac50 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
1ac60 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1ac70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69  PIWhere);.  sqli
1ac80 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1ac90 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1aca0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1acb0 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d  lete(db, pTblNam
1acc0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1acd0 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
1ace0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
1acf0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
1ad00 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
1ad10 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
1ad20 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
1ad30 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
1ad40 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
1ad50 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
1ad60 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
1ad70 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
1ad80 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
1ad90 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  osed to contain 
1ada0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1adb0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
1adc0 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
1add0 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
1ade0 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
1adf0 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
1ae00 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1ae10 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
1ae20 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
1ae30 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1ae40 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
1ae50 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
1ae60 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
1ae70 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
1ae80 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
1ae90 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
1aea0 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
1aeb0 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
1aec0 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ular combination
1aed0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
1aee0 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
1aef0 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
1af00 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
1af10 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
1af20 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
1af30 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1af40 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
1af50 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
1af60 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
1af70 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
1af80 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
1af90 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
1afa0 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
1afb0 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
1afc0 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
1afd0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
1afe0 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
1aff0 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
1b000 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
1b010 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
1b020 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
1b030 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1b040 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
1b050 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
1b060 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /*              
1b070 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37    10,  9,  8,  7
1b080 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ,  6 */.  LogEst
1b090 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20   aVal[] = { 33, 
1b0a0 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d  32, 30, 28, 26 }
1b0b0 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20  ;.  LogEst *a = 
1b0c0 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
1b0d0 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  t;.  int nCopy =
1b0e0 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61   MIN(ArraySize(a
1b0f0 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  Val), pIdx->nKey
1b100 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Col);.  int i;..
1b110 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72    /* Set the fir
1b120 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72  st entry (number
1b130 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1b140 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73  index) to the es
1b150 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75  timated .  ** nu
1b160 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1b170 74 68 65 20 74 61 62 6c 65 2e 20 4f 72 20 31 30  the table. Or 10
1b180 2c 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74  , if the estimat
1b190 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
1b1a0 73 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 74  s .  ** in the t
1b1b0 61 62 6c 65 20 69 73 20 6c 65 73 73 20 74 68 61  able is less tha
1b1c0 6e 20 74 68 61 74 2e 20 20 2a 2f 0a 20 20 61 5b  n that.  */.  a[
1b1d0 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  0] = pIdx->pTabl
1b1e0 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  e->nRowLogEst;. 
1b1f0 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61   if( a[0]<33 ) a
1b200 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20  [0] = 33;       
1b210 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71 6c   assert( 33==sql
1b220 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 29  ite3LogEst(10) )
1b230 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  ;..  /* Estimate
1b240 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31 30   that a[1] is 10
1b250 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b 33  , a[2] is 9, a[3
1b260 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73 20  ] is 8, a[4] is 
1b270 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a 20  7, a[5] is.  ** 
1b280 36 20 61 6e 64 20 65 61 63 68 20 73 75 62 73 65  6 and each subse
1b290 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66 20  quent value (if 
1b2a0 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a 20  any) is 5.  */. 
1b2b0 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20 61   memcpy(&a[1], a
1b2c0 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65 6f  Val, nCopy*sizeo
1b2d0 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66 6f  f(LogEst));.  fo
1b2e0 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d  r(i=nCopy+1; i<=
1b2f0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
1b300 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  ++){.    a[i] = 
1b310 32 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  23;             
1b320 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 32         assert( 2
1b330 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1b340 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (5) );.  }..  as
1b350 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
1b360 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 69  LogEst(1) );.  i
1b370 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
1b380 28 70 49 64 78 29 20 29 20 61 5b 70 49 64 78 2d  (pIdx) ) a[pIdx-
1b390 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d  >nKeyCol] = 0;.}
1b3a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1b3b0 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
1b3c0 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
1b3d0 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
1b3e0 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
1b3f0 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
1b400 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
1b410 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
1b420 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
1b430 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1b440 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
1b450 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
1b460 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
1b470 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1b480 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1b490 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72  nt iDb;..  asser
1b4a0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1b4b0 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72  =0 );   /* Never
1b4c0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69   called with pri
1b4d0 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  or errors */.  i
1b4e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1b4f0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1b500 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1b510 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b520 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
1b530 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1b540 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1b550 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1b560 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1b570 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
1b580 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
1b590 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
1b5a0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
1b5b0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1b5c0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
1b5d0 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
1b5e0 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
1b5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1b600 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1b610 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
1b620 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
1b630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1b640 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1b650 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
1b660 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
1b670 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1b680 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
1b690 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1b6a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1b6b0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1b6c0 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79  f( pIndex->idxTy
1b6d0 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1b6e0 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20 20  PE_APPDEF ){.   
1b6f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b700 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
1b710 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1b720 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
1b730 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1b740 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
1b750 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
1b760 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1b770 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1b780 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
1b790 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
1b7a0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1b7b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1b7c0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1b7d0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
1b7e0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1b7f0 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
1b800 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
1b810 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
1b820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1b830 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1b840 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
1b850 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
1b860 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
1b870 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1b880 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1b890 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
1b8a0 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
1b8b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1b8c0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1b8d0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
1b8e0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
1b8f0 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
1b900 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
1b910 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1b920 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1b930 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
1b940 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
1b950 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
1b960 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1b970 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1b980 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
1b990 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1b9a0 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
1b9b0 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
1b9c0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
1b9d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1b9e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1b9f0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1ba00 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1ba10 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1ba20 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1ba30 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1ba40 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
1ba50 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
1ba60 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e  WHERE name=%Q AN
1ba70 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
1ba80 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
1ba90 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
1baa0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
1bab0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
1bac0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1bad0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
1bae0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
1baf0 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1bb00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
1bb10 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1bb20 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
1bb30 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
1bb40 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
1bb50 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
1bb60 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1bb70 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
1bb80 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
1bb90 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
1bba0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
1bbb0 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
1bbc0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1bbd0 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1bbe0 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
1bbf0 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
1bc00 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
1bc10 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
1bc20 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
1bc30 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
1bc40 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
1bc50 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
1bc60 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
1bc70 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
1bc80 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
1bc90 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
1bca0 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
1bcb0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1bcc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1bcd0 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
1bce0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
1bcf0 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
1bd00 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
1bd10 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
1bd20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
1bd30 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
1bd40 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
1bd50 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
1bd60 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
1bd70 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
1bd80 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
1bd90 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
1bda0 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
1bdb0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
1bdc0 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
1bdd0 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
1bde0 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
1bdf0 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
1be00 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
1be10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1be20 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1be30 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
1be40 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
1be50 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
1be60 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
1be70 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1be80 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1be90 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
1bea0 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
1beb0 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
1bec0 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
1bed0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
1bee0 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
1bef0 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
1bf00 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1bf10 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
1bf20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
1bf30 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1bf40 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1bf50 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
1bf60 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
1bf70 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1bf80 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
1bf90 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
1bfa0 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
1bfb0 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
1bfc0 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
1bfd0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
1bfe0 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
1bff0 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
1c000 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
1c010 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
1c020 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1c030 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
1c040 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
1c050 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
1c060 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
1c070 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1c080 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
1c090 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
1c0a0 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
1c0b0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1c0c0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
1c0d0 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
1c0e0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1c0f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
1c100 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
1c110 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
1c120 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
1c130 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
1c140 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
1c150 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
1c160 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
1c170 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
1c180 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
1c190 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
1c1a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1c1b0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1c1c0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
1c1d0 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1c1e0 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
1c1f0 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
1c200 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
1c210 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1c220 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
1c230 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
1c240 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
1c250 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
1c260 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
1c270 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1c280 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1c290 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1c2a0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1c2b0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1c2c0 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
1c2d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1c2e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1c2f0 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
1c300 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1c310 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
1c320 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
1c330 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
1c340 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26  ->a[0]),.      &
1c350 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
1c360 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
1c370 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
1c380 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1c390 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1c3a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1c3b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1c3c0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1c3d0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
1c3e0 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
1c3f0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1c400 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1c410 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1c420 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1c430 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1c440 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1c450 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1c460 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1c470 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1c480 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1c490 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c4a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1c4b0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1c4c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1c4d0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1c4e0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1c4f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1c500 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
1c510 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
1c520 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
1c530 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
1c540 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1c550 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
1c560 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
1c570 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
1c580 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
1c590 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1c5a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
1c5b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1c5c0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1c5d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1c5e0 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
1c5f0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
1c600 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
1c610 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
1c620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
1c630 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
1c640 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
1c650 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
1c660 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
1c670 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
1c680 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
1c690 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
1c6a0 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
1c6b0 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
1c6c0 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
1c6d0 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
1c6e0 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
1c6f0 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
1c700 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
1c710 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
1c720 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
1c730 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
1c740 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
1c750 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1c760 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
1c770 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
1c780 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
1c790 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
1c7a0 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
1c7b0 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
1c7c0 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
1c7d0 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
1c7e0 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
1c7f0 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
1c800 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
1c810 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
1c820 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
1c830 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
1c840 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
1c850 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
1c860 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
1c870 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
1c880 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
1c890 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
1c8a0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1c8b0 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
1c8c0 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
1c8d0 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
1c8e0 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
1c8f0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
1c900 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
1c910 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
1c920 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
1c930 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
1c940 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1c950 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1c960 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
1c970 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1c980 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
1c990 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
1c9a0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
1c9b0 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
1c9c0 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
1c9d0 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
1c9e0 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
1c9f0 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
1ca00 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
1ca10 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
1ca20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
1ca30 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
1ca40 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
1ca50 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
1ca60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
1ca70 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
1ca80 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
1ca90 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
1caa0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1cab0 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
1cac0 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
1cad0 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
1cae0 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
1caf0 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29 70 53  */.  if( (u32)pS
1cb00 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e  rc->nSrc+nExtra>
1cb10 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  pSrc->nAlloc ){.
1cb20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65      SrcList *pNe
1cb30 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f  w;.    int nAllo
1cb40 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  c = pSrc->nSrc+n
1cb50 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e  Extra;.    int n
1cb60 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  Got;.    pNew = 
1cb70 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1cb80 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20  (db, pSrc,.     
1cb90 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1cba0 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f  (*pSrc) + (nAllo
1cbb0 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63  c-1)*sizeof(pSrc
1cbc0 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  ->a[0]) );.    i
1cbd0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1cbe0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1cbf0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1cc00 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72        return pSr
1cc10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  c;.    }.    pSr
1cc20 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47  c = pNew;.    nG
1cc30 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d  ot = (sqlite3DbM
1cc40 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e  allocSize(db, pN
1cc50 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53  ew) - sizeof(*pS
1cc60 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63  rc))/sizeof(pSrc
1cc70 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70  ->a[0])+1;.    p
1cc80 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47  Src->nAlloc = nG
1cc90 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  ot;.  }..  /* Mo
1cca0 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
1ccb0 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
1ccc0 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
1ccd0 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
1cce0 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
1ccf0 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
1cd00 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
1cd10 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
1cd20 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
1cd30 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
1cd40 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
1cd50 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a   nExtra;..  /* Z
1cd60 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
1cd70 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
1cd80 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
1cd90 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
1cda0 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1cdb0 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
1cdc0 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
1cdd0 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
1cde0 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
1cdf0 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
1ce00 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
1ce10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1ce20 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
1ce30 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
1ce40 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
1ce50 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
1ce60 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
1ce70 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
1ce80 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
1ce90 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1cea0 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
1ceb0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1cec0 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
1ced0 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a  pTable is NULL..
1cee0 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
1cef0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1cf00 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
1cf10 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
1cf20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  The returned.** 
1cf30 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65  SrcList might be
1cf40 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1cf50 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77 61   SrcList that wa
1cf60 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69  s input or it mi
1cf70 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20  ght be.** a new 
1cf80 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20  one.  If an OOM 
1cf90 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
1cfa0 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f  s, then the prio
1cfb0 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74  r value of pList
1cfc0 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75  .** that is inpu
1cfd0 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
1cfe0 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  e is automatical
1cff0 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
1d000 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
1d010 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
1d020 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
1d030 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
1d040 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
1d050 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
1d060 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
1d070 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
1d080 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
1d090 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
1d0a0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
1d0b0 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
1d0c0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1d0d0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
1d0e0 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
1d0f0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1d100 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
1d110 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
1d120 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
1d130 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
1d140 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
1d150 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
1d160 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
1d170 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
1d180 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
1d190 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
1d1a0 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
1d1b0 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
1d1c0 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
1d1d0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
1d1e0 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
1d1f0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1d200 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1d210 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
1d220 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
1d230 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
1d240 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1d250 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
1d260 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
1d270 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
1d280 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1d290 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1d2a0 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,B,C);.**.
1d2b0 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
1d2c0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1d2d0 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
1d2e0 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73  e name.  If C is
1d2f0 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e   defined.** then
1d300 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74   so is B.  In ot
1d310 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65  her words, we ne
1d320 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65 20  ver have a case 
1d330 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  where:.**.**    
1d340 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1d350 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c  istAppend(D,A,0,
1d360 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70  C);.**.** Both p
1d370 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1d380 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64 20  ase are assumed 
1d390 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54  to be quoted.  T
1d3a0 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65 64  hey are dequoted
1d3b0 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67  .** before being
1d3c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53 72   added to the Sr
1d3d0 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73  cList..*/.SrcLis
1d3e0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1d3f0 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74  tAppend(.  sqlit
1d400 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
1d410 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
1d420 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
1d430 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53   failures */.  S
1d440 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  rcList *pList,  
1d450 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
1d460 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55  this SrcList. NU
1d470 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  LL creates a new
1d480 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f   SrcList */.  To
1d490 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
1d4a0 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70    /* Table to ap
1d4b0 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pend */.  Token 
1d4c0 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a  *pDatabase    /*
1d4d0 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65   Database of the
1d4e0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
1d4f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d500 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
1d510 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d  ert( pDatabase==
1d520 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29  0 || pTable!=0 )
1d530 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76  ;  /* Cannot hav
1d540 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f  e C without B */
1d550 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1d560 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1d570 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1d580 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  ro(db, sizeof(Sr
1d590 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
1d5a0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1d5b0 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
1d5c0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
1d5d0 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
1d5e0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1d5f0 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
1d600 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
1d610 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1d620 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
1d630 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1d640 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1d650 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d660 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
1d670 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
1d680 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
1d690 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
1d6a0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
1d6b0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
1d6c0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
1d6d0 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
1d6e0 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
1d6f0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1d700 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
1d710 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
1d720 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
1d730 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1d740 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
1d750 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
1d760 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
1d770 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1d780 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
1d790 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1d7a0 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
1d7b0 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
1d7c0 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
1d7d0 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
1d7e0 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
1d7f0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1d800 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
1d810 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
1d820 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
1d830 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1d840 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1d850 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
1d860 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1d870 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
1d880 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
1d890 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
1d8a0 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
1d8b0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
1d8c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1d8d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
1d8e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1d8f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
1d900 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1d910 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1d920 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1d930 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
1d940 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
1d950 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1d960 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
1d970 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d980 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
1d990 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
1d9a0 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
1d9b0 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
1d9c0 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
1d9d0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1d9e0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
1d9f0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1da00 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1da10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1da20 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
1da30 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1da40 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1da50 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
1da60 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1da70 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
1da80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1da90 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
1daa0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1dab0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
1dac0 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1dad0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1dae0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
1daf0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1db00 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  , pItem->zIndex)
1db10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
1db20 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74  eteTable(db, pIt
1db30 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73  em->pTab);.    s
1db40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1db50 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  te(db, pItem->pS
1db60 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
1db70 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1db80 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20  , pItem->pOn);. 
1db90 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1dba0 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1dbb0 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20  ->pUsing);.  }. 
1dbc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1dbd0 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1dbe0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1dbf0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1dc00 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64 20  e parser to add 
1dc10 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
1dc20 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72  e.** end of a gr
1dc30 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73  owing FROM claus
1dc40 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72 61  e.  The "p" para
1dc50 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61 72  meter is the par
1dc60 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  t of.** the FROM
1dc70 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61 73   clause that has
1dc80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1dc90 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22 20  nstructed.  "p" 
1dca0 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68  is NULL.** if th
1dcb0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1dcc0 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d  term of the FROM
1dcd0 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65   clause.  pTable
1dce0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a   and pDatabase.*
1dcf0 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f  * are the name o
1dd00 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
1dd10 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69  database named i
1dd20 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1dd30 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61  e term..** pData
1dd40 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20  base is NULL if 
1dd50 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1dd60 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d  e qualifier is m
1dd70 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20  issing - the.** 
1dd80 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20  usual case.  If 
1dd90 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 6e 20  the term has an 
1dda0 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
1ddb0 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
1ddc0 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
1ddd0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
1dde0 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
1ddf0 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
1de00 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
1de10 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
1de20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
1de30 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
1de40 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
1de50 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
1de60 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
1de70 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
1de80 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
1de90 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
1dea0 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
1deb0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1dec0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
1ded0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
1dee0 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
1def0 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
1df00 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
1df10 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
1df20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1df30 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
1df40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1df50 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1df60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1df70 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
1df80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
1df90 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
1dfa0 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
1dfb0 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
1dfc0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
1dfd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1dfe0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
1dff0 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
1e000 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
1e010 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
1e020 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1e030 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1e040 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
1e050 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
1e060 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1e070 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1e080 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
1e090 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
1e0a0 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
1e0b0 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
1e0c0 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
1e0d0 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
1e0e0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e100 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
1e110 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
1e120 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
1e130 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
1e140 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
1e150 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
1e160 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e170 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
1e180 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1e190 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
1e1a0 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
1e1b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1e1c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1e1d0 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
1e1e0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1e1f0 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
1e200 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
1e210 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
1e220 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1e230 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
1e240 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1e250 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
1e260 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
1e270 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
1e280 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20  VER(p->nSrc==0) 
1e290 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1e2a0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1e2b0 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
1e2c0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1e2d0 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
1e2e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
1e2f0 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
1e300 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
1e310 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1e320 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
1e330 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
1e340 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
1e350 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
1e360 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1e370 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1e380 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
1e390 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
1e3a0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
1e3b0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1e3c0 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1e3d0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1e3e0 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
1e3f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1e400 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1e410 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
1e420 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1e430 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
1e440 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
1e450 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
1e460 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
1e470 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
1e480 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1e490 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1e4a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1e4b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1e4c0 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
1e4d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1e4e0 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
1e4f0 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
1e500 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
1e510 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
1e520 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53   && ALWAYS(p->nS
1e530 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72  rc>0) ){.    str
1e540 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e550 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1e560 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1e570 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e  assert( pItem->n
1e580 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20  otIndexed==0 && 
1e590 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30  pItem->zIndex==0
1e5a0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
1e5b0 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
1e5c0 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
1e5d0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
1e5e0 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
1e5f0 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
1e600 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
1e610 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
1e620 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
1e630 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1e640 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e      pItem->notIn
1e650 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1e660 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1e670 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
1e680 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1e690 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
1e6a0 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
1e6b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1e6c0 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
1e6d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
1e6e0 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
1e6f0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
1e700 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
1e710 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1e720 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
1e730 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1e740 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
1e750 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1e760 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
1e770 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
1e780 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
1e790 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
1e7a0 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
1e7b0 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
1e7c0 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
1e7d0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
1e7e0 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
1e7f0 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
1e800 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1e810 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
1e820 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
1e830 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
1e840 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
1e850 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
1e860 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
1e870 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
1e880 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
1e890 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
1e8a0 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
1e8b0 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
1e8c0 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
1e8d0 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
1e8e0 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
1e8f0 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
1e900 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
1e910 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
1e920 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
1e930 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
1e940 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1e950 20 61 73 73 65 72 74 28 20 70 2d 3e 61 20 7c 7c   assert( p->a ||
1e960 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b 0a 20   p->nSrc==0 );. 
1e970 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63     for(i=p->nSrc
1e980 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
1e990 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69       p->a[i].joi
1e9a0 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31  ntype = p->a[i-1
1e9b0 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ].jointype;.    
1e9c0 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f  }.    p->a[0].jo
1e9d0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a  intype = 0;.  }.
1e9e0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1e9f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1ea00 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
1ea10 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
1ea20 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1ea30 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
1ea40 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1ea50 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
1ea60 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1ea70 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1ea80 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
1ea90 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20  b!=0 );./*  if( 
1eaa0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
1eab0 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20  0 ) return; */. 
1eac0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1ead0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1eae0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1eaf0 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
1eb00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1eb10 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
1eb20 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1eb30 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
1eb40 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
1eb50 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
1eb60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
1eb70 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1eb80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1eb90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
1eba0 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
1ebb0 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
1ebc0 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
1ebd0 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1ebe0 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
1ebf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1ec00 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1ec10 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
1ec20 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
1ec30 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1ec40 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
1ec50 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
1ec60 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
1ec70 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
1ec80 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
1ec90 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1eca0 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
1ecb0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ecc0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1ecd0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
1ece0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
1ecf0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1ed00 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1ed10 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1ed20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1ed30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ed40 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1ed50 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
1ed60 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1ed70 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1ed80 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
1ed90 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
1eda0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1edb0 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
1edc0 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
1edd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1ede0 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
1edf0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1ee00 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1ee10 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1ee20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
1ee30 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1ee40 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1ee50 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1ee60 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1ee70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ee80 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1ee90 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
1eea0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
1eeb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1eec0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1eed0 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20   when it parses 
1eee0 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65  a command to cre
1eef0 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20  ate,.** release 
1ef00 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53  or rollback an S
1ef10 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a  QL savepoint. .*
1ef20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61  /.void sqlite3Sa
1ef30 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70  vepoint(Parse *p
1ef40 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
1ef50 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
1ef60 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
1ef70 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1ef80 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1ef90 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
1efa0 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  me ){.    Vdbe *
1efb0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1efc0 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  be(pParse);.#ifn
1efd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1efe0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1eff0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1f000 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d  har * const az[]
1f010 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52   = { "BEGIN", "R
1f020 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41  ELEASE", "ROLLBA
1f030 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  CK" };.    asser
1f040 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45  t( !SAVEPOINT_BE
1f050 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54  GIN && SAVEPOINT
1f060 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53  _RELEASE==1 && S
1f070 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1f080 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20  K==2 );.#endif. 
1f090 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c     if( !v || sql
1f0a0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1f0b0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56  arse, SQLITE_SAV
1f0c0 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20  EPOINT, az[op], 
1f0d0 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
1f0e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1f0f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1f100 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1f110 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
1f120 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f130 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20  , OP_Savepoint, 
1f140 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c  op, 0, 0, zName,
1f150 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1f160 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
1f170 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
1f180 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
1f190 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
1f1a0 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
1f1b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1f1c0 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
1f1d0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
1f1e0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
1f1f0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
1f200 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
1f210 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
1f220 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
1f230 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1f240 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
1f250 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
1f260 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
1f270 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1f280 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
1f290 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1f2a0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
1f2b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1f2c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
1f2d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1f2e0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1f2f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1f300 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
1f310 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1f320 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1f330 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
1f340 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
1f350 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
1f360 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
1f370 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62  (db->pVfs, 0, db
1f380 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73  , &pBt, 0, flags
1f390 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f3a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f3b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1f3c0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
1f3d0 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
1f3e0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
1f3f0 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
1f400 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
1f410 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
1f420 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
1f430 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
1f440 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1f450 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d  db->aDb[1].pBt =
1f460 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74   pBt;.    assert
1f470 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
1f480 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
1f490 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71  SQLITE_NOMEM==sq
1f4a0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
1f4b0 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e  eSize(pBt, db->n
1f4c0 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c  extPagesize, -1,
1f4d0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d   0) ){.      db-
1f4e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
1f4f0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1f500 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1f510 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f520 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
1f530 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  t that the schem
1f540 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65  a cookie will ne
1f550 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65  ed to be verifie
1f560 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73  d.** for databas
1f570 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65  e iDb.  The code
1f580 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72   to actually ver
1f590 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
1f5a0 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63  ookie.** will oc
1f5b0 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f  cur at the end o
1f5c0 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
1f5d0 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65  VDBE and will be
1f5e0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61   generated.** la
1f5f0 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46  ter, by sqlite3F
1f600 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
1f610 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1f620 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
1f630 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1f640 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
1f650 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1f660 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1f670 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
1f680 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c  ite3 *db = pTopl
1f690 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  evel->db;..  ass
1f6a0 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
1f6b0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1f6c0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1f6d0 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
1f6e0 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Db==1 );.  asser
1f6f0 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41  t( iDb<SQLITE_MA
1f700 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a  X_ATTACHED+2 );.
1f710 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f720 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1f730 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
1f740 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74    if( DbMaskTest
1f750 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
1f760 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1f770 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
1f780 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
1f790 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  ieMask, iDb);.  
1f7a0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f    pToplevel->coo
1f7b0 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
1f7c0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1f7d0 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
1f7e0 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  kie;.    if( !OM
1f7f0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1f800 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
1f810 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1f820 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b  base(pToplevel);
1f830 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1f840 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1f850 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  zDb is NULL, the
1f860 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  n call sqlite3Co
1f870 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29  deVerifySchema()
1f880 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74   for each .** at
1f890 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e  tached database.
1f8a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f   Otherwise, invo
1f8b0 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61  ke it for the da
1f8c0 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62  tabase named zDb
1f8d0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
1f8e0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1f8f0 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73  NamedSchema(Pars
1f900 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1f910 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73   char *zDb){.  s
1f920 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1f930 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1f940 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1f950 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1f960 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
1f970 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
1f980 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a   pDb->pBt && (!z
1f990 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  Db || 0==sqlite3
1f9a0 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62  StrICmp(zDb, pDb
1f9b0 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  ->zName)) ){.   
1f9c0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1f9d0 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1f9e0 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
1f9f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1fa00 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
1fa10 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
1fa20 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
1fa30 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
1fa40 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
1fa50 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
1fa60 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
1fa70 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1fa80 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
1fa90 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
1faa0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
1fab0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
1fac0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
1fad0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
1fae0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
1faf0 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
1fb00 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
1fb10 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
1fb20 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
1fb30 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
1fb40 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
1fb50 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
1fb60 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
1fb70 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
1fb80 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
1fb90 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
1fba0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
1fbb0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
1fbc0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
1fbd0 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
1fbe0 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
1fbf0 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
1fc00 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
1fc10 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
1fc20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
1fc30 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
1fc40 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
1fc50 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
1fc60 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
1fc70 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
1fc80 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
1fc90 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
1fca0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1fcb0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
1fcc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1fcd0 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
1fce0 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
1fcf0 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1fd00 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1fd10 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
1fd20 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1fd30 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1fd40 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  Db);.  DbMaskSet
1fd50 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74  (pToplevel->writ
1fd60 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70  eMask, iDb);.  p
1fd70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
1fd80 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
1fd90 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
1fda0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
1fdb0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
1fdc0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1fdd0 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
1fde0 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
1fdf0 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
1fe00 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
1fe10 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
1fe20 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
1fe30 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
1fe40 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
1fe50 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
1fe60 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
1fe70 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
1fe80 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
1fe90 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
1fea0 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
1feb0 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
1fec0 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
1fed0 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
1fee0 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
1fef0 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
1ff00 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
1ff10 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
1ff20 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
1ff30 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1ff40 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1ff50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
1ff60 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
1ff70 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
1ff80 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
1ff90 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
1ffa0 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
1ffb0 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
1ffc0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
1ffd0 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
1ffe0 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
1fff0 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
20000 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
20010 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
20020 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
20030 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
20040 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
20050 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
20060 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
20070 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
20080 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
20090 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
200a0 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
200b0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
200c0 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
200d0 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
200e0 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
200f0 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
20100 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
20110 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
20120 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
20130 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
20140 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
20150 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
20160 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
20170 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
20180 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
20190 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
201a0 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
201b0 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
201c0 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
201d0 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
201e0 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
201f0 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
20200 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
20210 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
20220 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
20230 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
20240 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
20250 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
20260 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
20270 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
20280 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
20290 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
202a0 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
202b0 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
202c0 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
202d0 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
202e0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
202f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
20300 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
20310 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
20320 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
20330 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
20340 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
20350 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
20360 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
20370 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
20380 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
20390 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
203a0 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
203b0 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
203c0 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
203d0 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
203e0 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
203f0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
20400 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
20410 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
20420 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
20430 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
20440 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
20450 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
20460 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
20470 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
20480 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
20490 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
204a0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
204b0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
204c0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
204d0 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
204e0 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  8 p4type,       
204f0 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
20500 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
20510 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20  .  u8 p5Errmsg  
20520 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73       /* P5_ErrMs
20530 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56  g type */.){.  V
20540 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
20550 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20560 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
20570 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
20580 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
20590 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
205a0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
205b0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
205c0 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
205d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
205e0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
205f0 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
20600 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20   p4, p4type);.  
20610 69 66 28 20 70 35 45 72 72 6d 73 67 20 29 20 73  if( p5Errmsg ) s
20620 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
20630 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b  P5(v, p5Errmsg);
20640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
20650 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
20660 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
20670 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
20680 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  t violation..*/.
20690 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71  void sqlite3Uniq
206a0 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ueConstraint(.  
206b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
206c0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
206d0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
206e0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
206f0 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
20700 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
20710 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
20720 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73  ex that triggers
20730 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
20740 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
20750 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53  rr;.  int j;.  S
20760 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a  trAccum errMsg;.
20770 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
20780 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  pIdx->pTable;.. 
20790 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
207a0 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 30 2c  Init(&errMsg, 0,
207b0 20 30 2c 20 32 30 30 29 3b 0a 20 20 65 72 72 4d   0, 200);.  errM
207c0 73 67 2e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  sg.db = pParse->
207d0 64 62 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  db;.  for(j=0; j
207e0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
207f0 6a 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  j++){.    char *
20800 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
20810 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
20820 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
20830 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53  if( j ) sqlite3S
20840 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65  trAccumAppend(&e
20850 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b  rrMsg, ", ", 2);
20860 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
20870 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
20880 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61  rrMsg, pTab->zNa
20890 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
208a0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
208b0 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b  errMsg, ".", 1);
208c0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
208d0 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
208e0 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
208f0 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  }.  zErr = sqlit
20900 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
20910 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  (&errMsg);.  sql
20920 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
20930 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  nt(pParse, .    
20940 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
20950 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45  x(pIdx) ? SQLITE
20960 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
20970 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20  ARYKEY .        
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e      : SQLITE_CON
209a0 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a  STRAINT_UNIQUE,.
209b0 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72      onError, zEr
209c0 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50  r, P4_DYNAMIC, P
209d0 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
209e0 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ue);.}.../*.** C
209f0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
20a00 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65  ue to non-unique
20a10 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20   rowid..*/.void 
20a20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73  sqlite3RowidCons
20a30 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
20a40 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
20a50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20a60 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
20a70 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
20a80 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
20a90 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c  orithm */.  Tabl
20aa0 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a  e *pTab       /*
20ab0 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   The table with 
20ac0 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72  the non-unique r
20ad0 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68  owid */ .){.  ch
20ae0 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20  ar *zMsg;.  int 
20af0 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rc;.  if( pTab->
20b00 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
20b10 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
20b20 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
20b30 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
20b40 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b60 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61    pTab->aCol[pTa
20b70 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
20b80 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
20b90 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
20ba0 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65  MARYKEY;.  }else
20bb0 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
20bc0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
20bd0 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69  se->db, "%s.rowi
20be0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
20bf0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
20c00 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
20c10 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ID;.  }.  sqlite
20c20 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
20c30 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72  pParse, rc, onEr
20c40 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  ror, zMsg, P4_DY
20c50 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20  NAMIC,.         
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
20c70 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
20c80 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ue);.}../*.** Ch
20c90 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
20ca0 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
20cb0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
20cc0 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
20cd0 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
20ce0 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
20cf0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
20d00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20d10 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
20d20 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
20d30 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
20d40 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
20d50 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
20d60 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
20d70 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
20d80 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
20d90 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
20da0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
20db0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
20dc0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
20dd0 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61  !=0 || pIndex->a
20de0 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a  iColumn[i]<0 );.
20df0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
20e00 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26  aiColumn[i]>=0 &
20e10 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
20e20 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Cmp(z, zColl) ){
20e30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
20e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20e50 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
20e60 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
20e70 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
20e80 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
20e90 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
20ea0 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
20eb0 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
20ec0 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
20ed0 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
20ee0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
20ef0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
20f00 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
20f10 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
20f20 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
20f30 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  b, char const *z
20f40 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Coll){.  Index *
20f50 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
20f60 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
20f70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20f80 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28   pTab */..  for(
20f90 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e  pIndex=pTab->pIn
20fa0 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
20fb0 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78  dex=pIndex->pNex
20fc0 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c  t){.    if( zCol
20fd0 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f  l==0 || collatio
20fe0 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49  nMatch(zColl, pI
20ff0 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69  ndex) ){.      i
21000 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
21010 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
21020 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
21030 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
21040 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
21050 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
21060 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
21070 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
21080 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
21090 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  dex, -1);.    }.
210a0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
210b0 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
210c0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c  l indices of all
210d0 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64   tables in all d
210e0 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74  atabases where t
210f0 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73  he.** indices us
21100 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
21110 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
21120 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
21130 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61  n recompute.** a
21140 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79  ll indices every
21150 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  where..*/.#ifnde
21160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
21170 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
21180 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73  d reindexDatabas
21190 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
211a0 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
211b0 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
211e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
211f0 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
21200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21210 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
21220 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
21230 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
21240 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
21250 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21260 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
21270 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
21280 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
21290 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
212a0 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
212b0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
212c0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
212d0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
212e0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
212f0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
21300 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
21310 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f  );  /* Needed fo
21320 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20  r schema access 
21330 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  */.  for(iDb=0, 
21340 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
21350 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
21360 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
21370 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
21380 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
21390 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
213a0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
213b0 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
213c0 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
213d0 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
213e0 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
213f0 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
21400 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
21410 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
21420 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
21430 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
21440 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
21450 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
21460 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
21470 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
21490 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
214a0 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
214b0 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
214c0 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
214d0 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
214e0 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
214f0 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
21500 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
21510 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
21520 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
21530 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
21540 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
21550 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
21560 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
21570 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
21580 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
21590 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
215a0 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
215b0 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
215c0 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
215d0 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
215e0 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
215f0 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
21600 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
21610 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
21620 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
21630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
21640 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
21650 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
21660 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
21670 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
21680 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
21690 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
216a0 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
216b0 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
216c0 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
216d0 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
216e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
216f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21700 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
21710 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
21720 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
21730 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
21740 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
21750 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
21760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
21770 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
21780 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
21790 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
217a0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
217b0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
217c0 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
217d0 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
217e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
217f0 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
21800 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
21810 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
21820 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
21830 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
21840 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
21850 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
21860 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21870 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
21880 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
21890 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
218a0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
218b0 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
218c0 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
218d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
218e0 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
218f0 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
21900 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
21910 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
21920 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
21930 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
21940 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
21950 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pName1==0 ){.   
21960 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
21970 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
21980 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
21990 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d  e if( NEVER(pNam
219a0 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32  e2==0) || pName2
219b0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
219c0 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
219d0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
219e0 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
219f0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
21a00 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
21a10 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
21a20 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
21a30 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
21a40 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
21a50 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
21a60 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  Coll, 0);.    if
21a70 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
21a80 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
21a90 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  s(pParse, zColl)
21aa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
21ab0 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
21ac0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
21ad0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21ae0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
21af0 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  l);.  }.  iDb = 
21b00 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
21b10 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
21b20 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
21b30 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
21b40 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
21b50 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
21b60 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a  omToken(db, pObj
21b70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
21b80 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44  0 ) return;.  zD
21b90 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
21ba0 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
21bb0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
21bc0 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
21bd0 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
21be0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
21bf0 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
21c00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21c10 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65  e(db, z);.    re
21c20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
21c30 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
21c40 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
21c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
21c60 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28  ee(db, z);.  if(
21c70 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
21c80 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
21c90 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
21ca0 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
21cb0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
21cc0 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
21cd0 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
21ce0 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
21cf0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21d00 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
21d10 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
21d20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
21d30 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
21d40 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49  ** Return a KeyI
21d50 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
21d60 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
21d70 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
21d80 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Index..**.** The
21d90 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
21da0 72 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20  re for an index 
21db0 69 73 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  is cached in the
21dc0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a   Index object..*
21dd0 2a 20 53 6f 20 74 68 65 72 65 20 6d 69 67 68 74  * So there might
21de0 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 72 65 66   be multiple ref
21df0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 72  erences to the r
21e00 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 2e  eturned pointer.
21e10 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20    The.** caller 
21e20 73 68 6f 75 6c 64 20 6e 6f 74 20 74 72 79 20 74  should not try t
21e30 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 4b 65 79  o modify the Key
21e40 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Info object..**.
21e50 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
21e60 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
21e70 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
21e80 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
21e90 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e  d object.** when
21ea0 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
21eb0 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65   using it..*/.Ke
21ec0 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
21ed0 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72  yInfoOfIndex(Par
21ee0 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
21ef0 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28 20  x *pIdx){.  if( 
21f00 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
21f10 65 74 75 72 6e 20 30 3b 0a 23 69 66 6e 64 65 66  eturn 0;.#ifndef
21f20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
21f30 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
21f40 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 26  pIdx->pKeyInfo &
21f50 26 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f  & pIdx->pKeyInfo
21f60 2d 3e 64 62 21 3d 70 50 61 72 73 65 2d 3e 64 62  ->db!=pParse->db
21f70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4b   ){.    sqlite3K
21f80 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 49 64 78  eyInfoUnref(pIdx
21f90 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  ->pKeyInfo);.   
21fa0 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20   pIdx->pKeyInfo 
21fb0 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
21fc0 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4b 65 79    if( pIdx->pKey
21fd0 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Info==0 ){.    i
21fe0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
21ff0 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ol = pIdx->nColu
22000 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  mn;.    int nKey
22010 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
22020 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
22030 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 70 49 64  Key;.    if( pId
22040 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
22050 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 73  {.      pKey = s
22060 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
22070 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
22080 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b  Key, nCol-nKey);
22090 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
220a0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
220b0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
220c0 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30  rse->db, nCol, 0
220d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
220e0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 61   pKey ){.      a
220f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
22100 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
22110 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20 20 20  (pKey) );.      
22120 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
22130 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
22140 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
22150 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
22160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43        assert( zC
22170 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  oll!=0 );.      
22180 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
22190 20 3d 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c   = strcmp(zColl,
221a0 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 3f 20 30  "BINARY")==0 ? 0
221b0 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
221d0 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
221e0 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
221f0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e  ;.        pKey->
22200 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
22210 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
22220 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
22230 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
22240 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
22250 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
22260 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ef(pKey);.      
22270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
22280 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Idx->pKeyInfo = 
22290 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pKey;.      }.  
222a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
222b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52   sqlite3KeyInfoR
222c0 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66  ef(pIdx->pKeyInf
222d0 6f 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  o);.}..#ifndef S
222e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
222f0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
22300 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  ne is invoked on
22310 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74 68  ce per CTE by th
22320 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 70  e parser while p
22330 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54  arsing a .** WIT
22340 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69  H clause. .*/.Wi
22350 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41  th *sqlite3WithA
22360 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  dd(.  Parse *pPa
22370 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
22380 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
22390 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
223a0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
223b0 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20 63   Existing WITH c
223c0 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
223d0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
223e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
223f0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f  ame of the commo
22400 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  n-table */.  Exp
22410 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c  rList *pArglist,
22420 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
22430 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73   column name lis
22440 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  t for the table 
22450 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75  */.  Select *pQu
22460 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ery          /* 
22470 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e  Query used to in
22480 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62  itialize the tab
22490 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  le */.){.  sqlit
224a0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
224b0 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65  >db;.  With *pNe
224c0 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  w;.  char *zName
224d0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
224e0 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20  at the CTE name 
224f0 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e  is unique within
22500 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75 73   this WITH claus
22510 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20  e. If.  ** not, 
22520 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69  store an error i
22530 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  n the Parse stru
22540 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d  cture. */.  zNam
22550 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
22560 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
22570 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
22580 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74  f( zName && pWit
22590 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
225a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
225b0 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
225c0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
225d0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
225e0 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e  , pWith->a[i].zN
225f0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
22600 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22610 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
22620 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c 65  icate WITH table
22630 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d   name: %s", zNam
22640 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
22650 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69  }.  }..  if( pWi
22660 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  th ){.    int nB
22670 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57  yte = sizeof(*pW
22680 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70  ith) + (sizeof(p
22690 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57  With->a[1]) * pW
226a0 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20  ith->nCte);.    
226b0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
226c0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74  Realloc(db, pWit
226d0 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  h, nByte);.  }el
226e0 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  se{.    pNew = s
226f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
22700 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
22710 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73  With));.  }.  as
22720 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 7c  sert( zName!=0 |
22730 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 61  | pNew==0 );.  a
22740 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
22750 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 4e  cFailed==0 || pN
22760 65 77 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ew==0 );..  if( 
22770 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
22780 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
22790 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73  lete(db, pArglis
227a0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
227b0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
227c0 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
227d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
227e0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  Name);.    pNew 
227f0 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65  = pWith;.  }else
22800 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  {.    pNew->a[pN
22810 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63  ew->nCte].pSelec
22820 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20  t = pQuery;.    
22830 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
22840 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67  te].pCols = pArg
22850 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  list;.    pNew->
22860 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e  a[pNew->nCte].zN
22870 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
22880 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
22890 43 74 65 5d 2e 7a 45 72 72 20 3d 20 30 3b 0a 20  Cte].zErr = 0;. 
228a0 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b     pNew->nCte++;
228b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
228c0 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
228d0 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ee the contents 
228e0 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  of the With obje
228f0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
22900 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
22910 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22920 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69  3WithDelete(sqli
22930 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
22940 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69  With){.  if( pWi
22950 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
22960 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
22970 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
22980 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
22990 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69  Cte *pCte = &pWi
229a0 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  th->a[i];.      
229b0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
229c0 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
229d0 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  pCols);.      sq
229e0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
229f0 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  e(db, pCte->pSel
22a00 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
22a10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
22a20 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
22a30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
22a40 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a  ree(db, pWith);.
22a50 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
22a60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
22a70 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a           OMIT_CTE) */.