/ Hex Artifact Content
Login

Artifact bde83dd5cf812e310a7e5ad2846790a14745bef4:


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 20 20 61 73 73 65 72 74 28 20 7a 4e 61  i;.  assert( zNa
26f0: 6d 65 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c  me!=0 );.  /* Al
2700: 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65  l mutexes are re
2710: 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d  quired for schem
2720: 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20  a access.  Make 
2730: 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65  sure we hold the
2740: 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  m. */.  assert( 
2750: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20  zDatabase!=0 || 
2760: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2770: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
2780: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
2790: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
27a0: 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  N.  /* Only the 
27b0: 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c  admin user is al
27c0: 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68  lowed to know th
27d0: 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73  at the sqlite_us
27e0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78  er table.  ** ex
27f0: 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  ists */.  if( db
2800: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
2810: 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20  <UAUTH_Admin && 
2820: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2830: 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29  able(zName)!=0 )
2840: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2850: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
2860: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2870: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2880: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2890: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
28a0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
28b0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
28c0: 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21    if( zDatabase!
28d0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
28e0: 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20  ICmp(zDatabase, 
28f0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
2900: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2910: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2920: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
2930: 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20  (db, j, 0) );.  
2940: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2950: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
2960: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
2970: 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sh, zName);.    
2980: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
2990: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
29a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
29b0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
29c0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
29d0: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
29e0: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
29f0: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
2a00: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
2a10: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
2a20: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
2a30: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2a40: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2a50: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2a60: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  L if not found. 
2a70: 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a   Also leave an.*
2a80: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * error message 
2a90: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
2aa0: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  sg..**.** The di
2ab0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2ac0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
2ad0: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  d sqlite3FindTab
2ae0: 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  le() is that thi
2af0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61  s.** routine lea
2b00: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
2b10: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2b20: 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a  zErrMsg where.**
2b30: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
2b40: 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  e() does not..*/
2b50: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
2b60: 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61  ocateTable(.  Pa
2b70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2b80: 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20       /* context 
2b90: 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f  in which to repo
2ba0: 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  rt errors */.  i
2bb0: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
2bc0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2bd0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56   looking for a V
2be0: 49 45 57 20 72 61 74 68 65 72 20 74 68 61 6e 20  IEW rather than 
2bf0: 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e  a TABLE */.  con
2c00: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2c10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2c20: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2c30: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2c40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2c50: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2c60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2c70: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
2c80: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
2c90: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
2ca0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
2cb0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2cc0: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
2cd0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
2ce0: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
2cf0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
2d00: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
2d10: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
2d20: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
2d30: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
2d40: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
2d50: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2d60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2d70: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
2d80: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( p==0 ){.    c
2d90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20  onst char *zMsg 
2da0: 3d 20 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73  = isView ? "no s
2db0: 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20  uch view" : "no 
2dc0: 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20  such table";.   
2dd0: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
2de0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2df0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
2e00: 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20  : %s.%s", zMsg, 
2e10: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
2e20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2e40: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
2e50: 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b  ", zMsg, zName);
2e60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2e70: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
2e80: 20 31 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49   1;.  }.#if SQLI
2e90: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 49 43  TE_USER_AUTHENIC
2ea0: 41 54 49 4f 4e 0a 20 20 65 6c 73 65 20 69 66 28  ATION.  else if(
2eb0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 75 74   pParse->db->aut
2ec0: 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54  h.authLevel<UAUT
2ed0: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 73 71  H_User ){.    sq
2ee0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2ef0: 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20  arse, "user not 
2f00: 61 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b  authenticated");
2f10: 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 7d 0a  .    p = 0;.  }.
2f20: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2f30: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
2f40: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  te the table ide
2f50: 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e 0a 2a  ntified by *p..*
2f60: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 77  *.** This is a w
2f70: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
2f80: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
2f90: 28 29 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  (). The differen
2fa0: 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 73 71  ce between.** sq
2fb0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
2fc0: 28 29 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  () and this func
2fd0: 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74 68 69  tion is that thi
2fe0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 74 72  s function restr
2ff0: 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65 61 72  icts.** the sear
3000: 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28 70 2d  ch to schema (p-
3010: 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69 74 20  >pSchema) if it 
3020: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e  is not NULL. p->
3030: 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65 0a 2a  pSchema may be.*
3040: 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69 74  * non-NULL if it
3050: 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 76 69   is part of a vi
3060: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 70 72  ew or trigger pr
3070: 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69 6f 6e  ogram definition
3080: 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74 65 33  . See.** sqlite3
3090: 46 69 78 53 72 63 4c 69 73 74 28 29 20 66 6f 72  FixSrcList() for
30a0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62   details..*/.Tab
30b0: 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  le *sqlite3Locat
30c0: 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20 50 61  eTableItem(.  Pa
30d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
30e0: 69 6e 74 20 69 73 56 69 65 77 2c 20 0a 20 20 73  int isView, .  s
30f0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3100: 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74  em *p.){.  const
3110: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73   char *zDb;.  as
3120: 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61  sert( p->pSchema
3130: 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62  ==0 || p->zDatab
3140: 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ase==0 );.  if( 
3150: 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  p->pSchema ){.  
3160: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
3170: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
3180: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3190: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44  pSchema);.    zD
31a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  b = pParse->db->
31b0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
31c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62    }else{.    zDb
31d0: 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b   = p->zDatabase;
31e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
31f0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
3200: 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
3210: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b   p->zName, zDb);
3220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
3230: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
3240: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
3250: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
3260: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67  rticular index g
3270: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
3280: 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61   that index.** a
3290: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
32a0: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
32b0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
32c0: 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  dex..** Return N
32d0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
32e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
32f0: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
3300: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
3310: 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  rched for the.**
3320: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66   table and the f
3330: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e  irst matching in
3340: 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dex is returned.
3350: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a    (No checking.*
3360: 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  * for duplicate 
3370: 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64  index names is d
3380: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
3390: 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45  h order is.** TE
33a0: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
33b0: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75  AIN, then any au
33c0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
33d0: 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67  s added.** using
33e0: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
33f0: 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  and..*/.Index *s
3400: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
3410: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
3420: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3430: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
3440: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30  {.  Index *p = 0
3450: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f 2a 20  ;.  int i;.  /* 
3460: 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20  All mutexes are 
3470: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68  required for sch
3480: 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b  ema access.  Mak
3490: 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74  e sure we hold t
34a0: 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  hem. */.  assert
34b0: 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69  ( zDb!=0 || sqli
34c0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
34d0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
34e0: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
34f0: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
3500: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
3510: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
3520: 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d  ;  /* Search TEM
3530: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
3540: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
3550: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a  hema = db->aDb[j
3560: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61  ].pSchema;.    a
3570: 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 29  ssert( pSchema )
3580: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
3590: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
35a0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
35b0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
35c0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e;.    assert( s
35d0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
35e0: 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20  xHeld(db, j, 0) 
35f0: 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
3600: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
3610: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
3620: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
3630: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
3640: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
3650: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
3660: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
3670: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
3680: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 73  void freeIndex(s
3690: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65  qlite3 *db, Inde
36a0: 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
36b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
36c0: 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  ZE.  sqlite3Dele
36d0: 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64  teIndexSamples(d
36e0: 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  b, p);.#endif.  
36f0: 69 66 28 20 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  if( db==0 || db-
3700: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
3710: 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   ) sqlite3KeyInf
3720: 6f 55 6e 72 65 66 28 70 2d 3e 70 4b 65 79 49 6e  oUnref(p->pKeyIn
3730: 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  fo);.  sqlite3Ex
3740: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
3750: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
3760: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3770: 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b  db, p->zColAff);
3780: 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69  .  if( p->isResi
3790: 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46  zed ) sqlite3DbF
37a0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 43 6f 6c  ree(db, p->azCol
37b0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
37c0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
37d0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64  *.** For the ind
37e0: 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61  ex called zIdxNa
37f0: 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e  me which is foun
3800: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
3810: 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65  e iDb,.** unlike
3820: 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d   that index from
3830: 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20   its Table then 
3840: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
3850: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64   from.** the ind
3860: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
3870: 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  d free all memor
3880: 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  y structures ass
3890: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
38a0: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f  the index..*/.vo
38b0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
38c0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
38d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
38e0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
38f0: 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e  *zIdxName){.  In
3900: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48  dex *pIndex;.  H
3910: 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61  ash *pHash;..  a
3920: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
3930: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
3940: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70  , iDb, 0) );.  p
3950: 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Hash = &db->aDb[
3960: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
3970: 78 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20  xHash;.  pIndex 
3980: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
3990: 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e  ert(pHash, zIdxN
39a0: 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  ame, 0);.  if( A
39b0: 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b  LWAYS(pIndex) ){
39c0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
39d0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
39e0: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
39f0: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3a00: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
3a10: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
3a20: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
3a30: 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73  *p;.      /* Jus
3a40: 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c  tification of AL
3a50: 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64  WAYS();  The ind
3a60: 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68  ex must be on th
3a70: 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20  e list of.      
3a80: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20  ** indices. */. 
3a90: 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d       p = pIndex-
3aa0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
3ab0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
3ac0: 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e  WAYS(p) && p->pN
3ad0: 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70  ext!=pIndex ){ p
3ae0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20   = p->pNext; }. 
3af0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
3b00: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
3b10: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
3b20: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
3b30: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3b40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
3b50: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3b60: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  ex);.  }.  db->f
3b70: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
3b80: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
3b90: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f  ./*.** Look thro
3ba0: 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ugh the list of 
3bb0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
3bc0: 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  les in db->aDb[]
3bd0: 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68   and if.** any h
3be0: 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  ave been closed,
3bf0: 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
3c00: 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61  m the list.  Rea
3c10: 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64  llocate the.** d
3c20: 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75  b->aDb[] structu
3c30: 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20  re to a smaller 
3c40: 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  size, if possibl
3c50: 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30  e..**.** Entry 0
3c60: 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74   (the "main" dat
3c70: 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79  abase) and entry
3c80: 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20 64   1 (the "temp" d
3c90: 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20  atabase).** are 
3ca0: 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65 73  never candidates
3cb0: 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61   for being colla
3cc0: 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  psed..*/.void sq
3cd0: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
3ce0: 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69 74  abaseArray(sqlit
3cf0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
3d00: 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  , j;.  for(i=j=2
3d10: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3d20: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3d30: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3d40: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3d50: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3d60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3d70: 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  db, pDb->zName);
3d80: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
3d90: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
3da0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
3db0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
3dc0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
3dd0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
3de0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
3df0: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
3e00: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
3e10: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
3e20: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
3e30: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
3e40: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
3e50: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
3e60: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
3e70: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
3e80: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
3e90: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
3ea0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3eb0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20  (db, db->aDb);. 
3ec0: 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d     db->aDb = db-
3ed0: 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a  >aDbStatic;.  }.
3ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
3ef0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
3f00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 69 6e  e database at in
3f10: 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72  dex iDb.  Also r
3f20: 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50  eset the.** TEMP
3f30: 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64   schema..*/.void
3f40: 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
3f50: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
3f60: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
3f70: 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72  Db *pDb;.  asser
3f80: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
3f90: 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  ;..  /* Case 1: 
3fa0: 20 52 65 73 65 74 20 74 68 65 20 73 69 6e 67 6c   Reset the singl
3fb0: 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74 69 66  e schema identif
3fc0: 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a 20 20  ied by iDb */.  
3fd0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
3fe0: 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Db];.  assert( s
3ff0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
4000: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
4010: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4020: 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29  Db->pSchema!=0 )
4030: 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d  ;.  sqlite3Schem
4040: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4050: 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  ema);..  /* If a
4060: 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65  ny database othe
4070: 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72  r than TEMP is r
4080: 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20  eset, then also 
4090: 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20  reset TEMP.  ** 
40a0: 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67 68 74  since TEMP might
40b0: 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72 69 67   be holding trig
40c0: 67 65 72 73 20 74 68 61 74 20 72 65 66 65 72 65  gers that refere
40d0: 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  nce tables in th
40e0: 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64 61 74  e.  ** other dat
40f0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
4100: 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ( iDb!=1 ){.    
4110: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31  pDb = &db->aDb[1
4120: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
4130: 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29  Db->pSchema!=0 )
4140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68  ;.    sqlite3Sch
4150: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
4160: 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 72 65  chema);.  }.  re
4170: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  turn;.}../*.** E
4180: 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20  rase all schema 
4190: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
41a0: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
41b0: 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69  tabases (includi
41c0: 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64  ng.** "main" and
41d0: 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73   "temp") for a s
41e0: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63  ingle database c
41f0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
4200: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41  id sqlite3ResetA
4210: 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65  llSchemasOfConne
4220: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
4230: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  b){.  int i;.  s
4240: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
4250: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
4260: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
4270: 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
4280: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
4290: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
42a0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
42b0: 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72  lite3SchemaClear
42c0: 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pDb->pSchema);.
42d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
42e0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
42f0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4300: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
4310: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
4320: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
4330: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
4340: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
4350: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a  seArray(db);.}..
4360: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4370: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
4380: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
4390: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
43a0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
43b0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
43c0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
43d0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
43e0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
43f0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f  *.** Delete memo
4400: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ry allocated for
4410: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
4420: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  s of a table or 
4430: 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62  view (the.** Tab
4440: 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29  le.aCol[] array)
4450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4460: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c   sqliteDeleteCol
4470: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4480: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4490: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
44a0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
44b0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
44c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
44d0: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
44e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
44f0: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
4500: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
4510: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4520: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4530: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
4540: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4550: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
4560: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4570: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4580: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >zDflt);.      s
4590: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
45a0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20   pCol->zType);. 
45b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
45c0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
45d0: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
45e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
45f0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
4600: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
4610: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
4620: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
4630: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4640: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
4650: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
4660: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
4670: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
4680: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4690: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
46a0: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
46b0: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
46c0: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
46d0: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
46e0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
46f0: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
4700: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
4710: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
4720: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
4730: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4740: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
4750: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
4760: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20  e..**.** The db 
4770: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70 74  parameter is opt
4780: 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e 65  ional.  It is ne
4790: 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62 6c  eded if the Tabl
47a0: 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e  e object .** con
47b0: 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20  tains lookaside 
47c0: 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65 20  memory.  (Table 
47d0: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
47e0: 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65  chema do not use
47f0: 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  .** lookaside me
4800: 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20 65  mory, but some e
4810: 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
4820: 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72 20  bjects do.)  Or 
4830: 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65  the.** db parame
4840: 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  ter can be used 
4850: 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65 73  with db->pnBytes
4860: 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72 65  Freed to measure
4870: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75   the memory.** u
4880: 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c 65  sed by the Table
4890: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
48a0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
48b0: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
48c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
48d0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
48e0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53 54  , *pNext;.  TEST
48f0: 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61  ONLY( int nLooka
4900: 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64 20  side; ) /* Used 
4910: 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73  to verify lookas
4920: 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  ide not used for
4930: 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73   schema */..  as
4940: 73 65 72 74 28 20 21 70 54 61 62 6c 65 20 7c 7c  sert( !pTable ||
4950: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
4960: 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  );..  /* Do not 
4970: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
4980: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
4990: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
49a0: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  es zero. */.  if
49b0: 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75  ( !pTable ) retu
49c0: 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20  rn;.  if( ((!db 
49d0: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
49e0: 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54  eed==0) && (--pT
49f0: 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29  able->nRef)>0) )
4a00: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52   return;..  /* R
4a10: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4a20: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4a30: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4a40: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4a50: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4a60: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4a70: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4a80: 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20  .  Since schema 
4a90: 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73  Tables do not us
4aa0: 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  e.  ** lookaside
4ab0: 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68  , this number sh
4ac0: 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e  ould not change.
4ad0: 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   */.  TESTONLY( 
4ae0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28 64 62  nLookaside = (db
4af0: 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62   && (pTable->tab
4b00: 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
4b10: 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20  eral)==0) ?.    
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
4b40: 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a  de.nOut : 0 );..
4b50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4b60: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4b70: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4b80: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4b90: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4ba0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4bb0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4bc0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4bd0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4be0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4bf0: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4c00: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
4c10: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
4c20: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4c30: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
4c40: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
4c50: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
4c60: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
4c70: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4c80: 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 26  sert(.         &
4c90: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
4ca0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
4cb0: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
4cc0: 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20    assert( db==0 
4cd0: 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  || sqlite3Schema
4ce0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
4cf0: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4d00: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
4d10: 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20  t( pOld==pIndex 
4d20: 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20  || pOld==0 );.  
4d30: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
4d40: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
4d50: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
4d60: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
4d70: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
4d80: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
4d90: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
4da0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4db0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
4dc0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
4dd0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
4de0: 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  eDeleteColumnNam
4df0: 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
4e00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4e10: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  db, pTable->zNam
4e20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
4e30: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
4e40: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
4e50: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
4e60: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
4e70: 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ect);.#ifndef SQ
4e80: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
4e90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ea0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
4eb0: 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e  le->pCheck);.#en
4ec0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
4ed0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4ee0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
4ef0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
4f00: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
4f10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4f20: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
4f30: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
4f40: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
4f50: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
4f60: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
4f70: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
4f80: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
4f90: 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  e==db->lookaside
4fa0: 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  .nOut );.}../*.*
4fb0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
4fc0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
4fd0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
4fe0: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
4ff0: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5000: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
5010: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
5020: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
5030: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
5040: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
5050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
5060: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5070: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5080: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5090: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
50a0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
50b0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
50c0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
50d0: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
50e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
50f0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5100: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
5110: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
5120: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
5130: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
5140: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
5150: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
5160: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5170: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5180: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5190: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
51a0: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
51b0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
51c0: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
51d0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
51e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
51f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5200: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
5210: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
5220: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
5230: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
5240: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
5250: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
5260: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
5270: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5280: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
5290: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
52a0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
52b0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
52c0: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
52d0: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
52e0: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
52f0: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
5300: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
5310: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
5320: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
5330: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
5340: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
5350: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
5360: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
5370: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
5380: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
5390: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
53a0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
53b0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
53c0: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
53d0: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
53e0: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
53f0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5400: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
5410: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
5420: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
5430: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
5440: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
5450: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5460: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
5470: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
5480: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
5490: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
54a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
54b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
54c0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
54d0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
54e0: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
54f0: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
5500: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
5510: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
5520: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
5530: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
5540: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
5550: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
5560: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
5570: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5580: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
5590: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
55a0: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
55b0: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
55c0: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
55d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
55e0: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
55f0: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
5600: 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69  OT, iDb, 5);.  i
5610: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
5620: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
5630: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
5640: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
5650: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
5660: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
5670: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5680: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
5690: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
56a0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
56b0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
56c0: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
56d0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
56e0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
56f0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
5700: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
5710: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
5720: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
5730: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
5740: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5750: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
5760: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5770: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
5780: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5790: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
57a0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
57b0: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74  Db *pDb;.    int
57c0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
57d0: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
57e0: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
57f0: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
5800: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
5810: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
5820: 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  ( (!OMIT_TEMPDB 
5830: 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d  || i!=1 ) && n==
5840: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5850: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
5860: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
5870: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
5880: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
5890: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
58a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
58b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
58c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
58d0: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
58e0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
58f0: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
5900: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
5910: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5920: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5930: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
5940: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
5950: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
5960: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
5970: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
5980: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5990: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
59a0: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
59b0: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
59c0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
59d0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ame){.  int i;  
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a00: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5a10: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
5a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
5a40: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
5a50: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d  ng for */.  zNam
5a60: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5a70: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
5a80: 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  me);.  i = sqlit
5a90: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
5aa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
5ab0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
5ac0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  me);.  return i;
5ad0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
5ae0: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
5af0: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
5b00: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
5b10: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
5b20: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5b30: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5b40: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5b50: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5b60: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
5b70: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5b80: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
5b90: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5ba0: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
5bb0: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
5bc0: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
5bd0: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
5be0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
5bf0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
5c00: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
5c10: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
5c20: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
5c30: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
5c40: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
5c50: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
5c60: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
5c70: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
5c80: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5c90: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5ca0: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
5cb0: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
5cc0: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
5cd0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
5ce0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
5cf0: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
5d00: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
5d10: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
5d20: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
5d30: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
5d40: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
5d50: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
5d60: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5d70: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
5d80: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
5d90: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
5da0: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
5db0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
5dc0: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
5dd0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
5de0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
5df0: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
5e00: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
5e10: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
5e20: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
5e30: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
5e40: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5e50: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
5e60: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
5e70: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5e80: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57  ->db;..  if( ALW
5e90: 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26  AYS(pName2!=0) &
5ea0: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
5eb0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  .    if( db->ini
5ec0: 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20  t.busy ) {.     
5ed0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5ee0: 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70  (pParse, "corrup
5ef0: 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  t database");.  
5f00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5f10: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5f20: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
5f30: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
5f40: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
5f50: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
5f60: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
5f70: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
5f80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5f90: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
5fa0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
5fb0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  me1);.      pPar
5fc0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5fd0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5fe0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5ff0: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
6000: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
6010: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
6020: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
6030: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
6040: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
6050: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
6060: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6070: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
6080: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
6090: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
60a0: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
60b0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
60c0: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
60d0: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
60e0: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
60f0: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
6100: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
6110: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
6120: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
6130: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
6140: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
6150: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
6160: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
6170: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
6180: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
6190: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
61a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
61b0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
61c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
61d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
61e0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
61f0: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
6200: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
6210: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
6220: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
6230: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
6240: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
6250: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
6260: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
6270: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
6280: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
6290: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
62a0: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
62b0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
62c0: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
62d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
62e0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
62f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6300: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6310: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49  * Return the PRI
6320: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f  MARY KEY index o
6330: 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64  f a table.*/.Ind
6340: 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61  ex *sqlite3Prima
6350: 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65  ryKeyIndex(Table
6360: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
6370: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61   *p;.  for(p=pTa
6380: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  b->pIndex; p && 
6390: 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
63a0: 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78  ex(p); p=p->pNex
63b0: 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  t){}.  return p;
63c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
63d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69   the column of i
63e0: 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63  ndex pIdx that c
63f0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61  orresponds to ta
6400: 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43  ble.** column iC
6410: 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  ol.  Return -1 i
6420: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
6430: 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  i16 sqlite3Colum
6440: 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  nOfIndex(Index *
6450: 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b  pIdx, i16 iCol){
6460: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6470: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
6480: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6490: 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
64a0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65  aiColumn[i] ) re
64b0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
64c0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
64d0: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
64e0: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
64f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6500: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
6510: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
6520: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
6530: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
6540: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
6550: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
6560: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6570: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
6580: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
6590: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
65a0: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
65b0: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
65c0: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
65d0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
65e0: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
65f0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
6600: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
6610: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
6620: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
6630: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
6640: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
6650: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6660: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
6670: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
6680: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
6690: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
66a0: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
66b0: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
66c0: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
66d0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
66e0: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
66f0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
6700: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6710: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
6720: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
6730: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
6740: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
6750: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
6760: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
6770: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
6780: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
6790: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
67a0: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
67b0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
67c0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
67d0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
67e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
67f0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
6800: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
6810: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
6820: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
6830: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
6840: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
6850: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
6860: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6870: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
6880: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
6890: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
68a0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
68b0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
68c0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
68d0: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
68e0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
68f0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
6900: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
6910: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6920: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
6930: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
6940: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6950: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
6960: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
6970: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6980: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
6990: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
69a0: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
69b0: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
69c0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
69d0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
69e0: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
69f0: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
6a00: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
6a10: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
6a20: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6a30: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
6a40: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
6a50: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6a60: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
6a70: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
6a80: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6a90: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
6aa0: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
6ab0: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
6ac0: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62  */..  /* The tab
6ad0: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
6ae0: 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73  to create is pas
6af0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
6b00: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20  ine via tokens. 
6b10: 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70   ** pName1 and p
6b20: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
6b30: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
6b40: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
6b50: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
6b60: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
6b70: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
6b80: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e  .  ** .  ** Then
6b90: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
6ba0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
6bb0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
6bc0: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20   other hand if. 
6bd0: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61   ** the table na
6be0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
6bf0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
6c00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
6c10: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
6c20: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
6c30: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
6c40: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
6c50: 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20  e2 is ""..  **. 
6c60: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c   ** The call bel
6c70: 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d  ow sets the pNam
6c80: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  e pointer to poi
6c90: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
6ca0: 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20  (pName1 or.  ** 
6cb0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
6cc0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
6cd0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
6ce0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62  The variable iDb
6cf0: 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20   is.  ** set to 
6d00: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
6d10: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74   database that t
6d20: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6d30: 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63   is to be.  ** c
6d40: 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a  reated in..  */.
6d50: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
6d60: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
6d70: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
6d80: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
6d90: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
6da0: 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  ;.  if( !OMIT_TE
6db0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26  MPDB && isTemp &
6dc0: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26  & pName2->n>0 &&
6dd0: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f   iDb!=1 ){.    /
6de0: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
6df0: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
6e00: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
6e10: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
6e20: 73 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  s .    ** the da
6e30: 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22  tabase name is "
6e40: 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a  temp" anyway.  *
6e50: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
6e60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
6e70: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
6e80: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
6e90: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72  alified");.    r
6ea0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
6eb0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6ec0: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
6ed0: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
6ee0: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
6ef0: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
6f00: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
6f10: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
6f20: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
6f30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c  eturn;.  if( SQL
6f40: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
6f50: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
6f60: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
6f70: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
6f80: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
6f90: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
6fa0: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
6fb0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
6fc0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
6fd0: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
6fe0: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
6ff0: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
7000: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
7010: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
7020: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7030: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7040: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7050: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
7060: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
7070: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
7080: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7090: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
70a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
70b0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
70c0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
70d0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
70e0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
70f0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7100: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7110: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
7120: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
7130: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7140: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
7150: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
7160: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
7170: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
7180: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
7190: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
71a0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
71b0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
71c0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
71d0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
71e0: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
71f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7200: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  code, zName, 0, 
7210: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
7220: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7230: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7240: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
7250: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
7260: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
7270: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
7280: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
7290: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
72a0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65  name in the same
72b0: 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75   database.  Issu
72c0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
72d0: 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f  ge if.  ** it do
72e0: 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  es. The exceptio
72f0: 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74  n is if the stat
7300: 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73  ement being pars
7310: 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20  ed was passed.  
7320: 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ** to an sqlite3
7330: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20  _declare_vtab() 
7340: 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61  call. In that ca
7350: 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  se only the colu
7360: 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e  mn names.  ** an
7370: 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20  d types will be 
7380: 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69  used, so there i
7390: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73  s no need to tes
73a0: 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a  t for namespace.
73b0: 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e    ** collisions.
73c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f  .  */.  if( !IN_
73d0: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
73e0: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
73f0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7400: 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  me;.    if( SQLI
7410: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
7420: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
7430: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7440: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
7460: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
7470: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
7480: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
7490: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
74a0: 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20  f( !noErr ){.   
74b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
74c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
74d0: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
74e0: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
74f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7500: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
7510: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
7520: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
7530: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
7540: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
7550: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
7560: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7570: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7580: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
7590: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  x(db, zName, zDb
75a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
75b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
75c0: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
75d0: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
75e0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
75f0: 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  e);.      goto b
7600: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
7620: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Table = sqlite3D
7630: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
7640: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
7650: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
7660: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
7670: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
7680: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
7690: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
76a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
76b0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
76c0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
76d0: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
76e0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
76f0: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
7700: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
7710: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7720: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
7730: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  e->nRef = 1;.  p
7740: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
7750: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
7760: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
7770: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
7780: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
7790: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
77a0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
77b0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
77c0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
77d0: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
77e0: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
77f0: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
7800: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
7810: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
7820: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
7830: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
7840: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
7850: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
7860: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
7870: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
7880: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7890: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
78a0: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
78b0: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
78c0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
78d0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
78e0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
78f0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
7900: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
7910: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
7920: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
7930: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
7940: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7950: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
7960: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
7970: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
7980: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
7990: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
79a0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
79b0: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
79c0: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
79d0: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
79e0: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
79f0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
7a00: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
7a10: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
7a20: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
7a30: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
7a40: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
7a50: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
7a60: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
7a70: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
7a80: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
7a90: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
7aa0: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
7ab0: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
7ac0: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
7ad0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7ae0: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
7af0: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
7b00: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
7b10: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
7b20: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
7b30: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
7b40: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
7b50: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
7b60: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
7b70: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
7b80: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
7b90: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
7ba0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
7bb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7bc0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7bd0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
7be0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
7bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7c00: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
7c10: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
7c20: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
7c30: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
7c40: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
7c50: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
7c60: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
7c70: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
7c80: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
7c90: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
7ca0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7cb0: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
7cc0: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
7cd0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7ce0: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
7cf0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
7d00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7d10: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
7d20: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
7d30: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
7d40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
7d50: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
7d60: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
7d70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
7d80: 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62  P_If, reg3); Vdb
7d90: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7da0: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
7db0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
7dc0: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
7dd0: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
7de0: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
7df0: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
7e00: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
7e10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7e20: 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f  _Integer, fileFo
7e30: 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20  rmat, reg3);.   
7e40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7e50: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7e60: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46  ie, iDb, BTREE_F
7e70: 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33  ILE_FORMAT, reg3
7e80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7e90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7ea0: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
7eb0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ed0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
7ee0: 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45  Db, BTREE_TEXT_E
7ef0: 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a  NCODING, reg3);.
7f00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
7f10: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
7f20: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73  .    /* This jus
7f30: 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63  t creates a plac
7f40: 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20  e-holder record 
7f50: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
7f60: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  ster table..    
7f70: 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72  ** The record cr
7f80: 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63  eated does not c
7f90: 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20  ontain anything 
7fa0: 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  yet.  It will be
7fb0: 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a   replaced.    **
7fc0: 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74   by the real ent
7fd0: 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72  ry in code gener
7fe0: 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45  ated at sqlite3E
7ff0: 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a  ndTable()..    *
8000: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  *.    ** The row
8010: 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  id for the new e
8020: 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20  ntry is left in 
8030: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
8040: 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a  >regRowid..    *
8050: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
8060: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
8070: 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20  w table is left 
8080: 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72  in reg pParse->r
8090: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54  egRoot..    ** T
80a0: 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f  he rowid and roo
80b0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61  t page number va
80c0: 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20  lues are needed 
80d0: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
80e0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
80f0: 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e  ndTable will gen
8100: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
8110: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8120: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
8130: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8140: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8150: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
8160: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
8170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8180: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8190: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32  Integer, 0, reg2
81a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
81b0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
81c0: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
81d0: 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  b = sqlite3VdbeA
81e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
81f0: 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65  teTable, iDb, re
8200: 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g2);.    }.    s
8210: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
8220: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
8230: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
8240: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8250: 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  NewRowid, 0, reg
8260: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8270: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8280: 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a  Null, 0, reg3);.
8290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
82a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
82b0: 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67  rt, 0, reg3, reg
82c0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
82d0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
82e0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
82f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8300: 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp0(v, OP_Close
8310: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
8320: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
8330: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
8340: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
8350: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
8360: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
8370: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
8380: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
8390: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
83a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
83b0: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75   This macro is u
83c0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  sed to compare t
83d0: 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  wo strings in a 
83e0: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
83f0: 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69   manner..** It i
8400: 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65  s slightly faste
8410: 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73  r than calling s
8420: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20  qlite3StrICmp() 
8430: 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a  directly, but.**
8440: 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72   produces larger
8450: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52   code..**.** WAR
8460: 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f  NING: This macro
8470: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62   is not compatib
8480: 6c 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63  le with the strc
8490: 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a  mp() family. It.
84a0: 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  ** returns true 
84b0: 69 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e  if the two strin
84c0: 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74  gs are equal, ot
84d0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
84e0: 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d  /.#define STRICM
84f0: 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74  P(x, y) (\.sqlit
8500: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
8510: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
8520: 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69  )(x)]==   \.sqli
8530: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
8540: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  *(unsigned char 
8550: 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20  *)(y)]     \.&& 
8560: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28  sqlite3StrICmp((
8570: 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29  x)+1,(y)+1)==0 )
8580: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8590: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
85a0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
85b0: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
85c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
85d0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
85e0: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
85f0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
8600: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
8610: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8620: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33  tement.  sqlite3
8630: 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74  StartTable() get
8640: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73  s called.** firs
8650: 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20  t to get things 
8660: 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69  going.  Then thi
8670: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8680: 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  led for each.** 
8690: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
86a0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
86b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
86c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
86d0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
86e0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
86f0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
8700: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8710: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
8720: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8730: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8740: 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45  turn;.#if SQLITE
8750: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
8760: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
8770: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8780: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
8790: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
87a0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
87b0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
87c0: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
87d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
87e0: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c  #endif.  z = sql
87f0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
8800: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
8810: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
8820: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
8830: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
8840: 20 20 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a     if( STRICMP(z
8850: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
8860: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
8870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8880: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
8890: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
88a0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
88b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
88c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
88d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
88e0: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
88f0: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
8900: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
8910: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
8920: 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  loc(db,p->aCol,(
8930: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
8940: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8950: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
8960: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8970: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
8980: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8990: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
89a0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
89b0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
89c0: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
89d0: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
89e0: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
89f0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
8a00: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
8a10: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
8a20: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
8a30: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
8a40: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
8a50: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
8a60: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
8a70: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
8a80: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
8a90: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
8aa0: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
8ab0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
8ac0: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
8ad0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8ae0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
8af0: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  E;.  pCol->szEst
8b00: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b   = 1;.  p->nCol+
8b10: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
8b20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8b30: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8b40: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
8b50: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
8b60: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
8b70: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
8b80: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
8b90: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
8ba0: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
8bb0: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
8bc0: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
8bd0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
8be0: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
8bf0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8c00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
8c10: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
8c20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8c30: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
8c40: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20  Table *p;.  p = 
8c50: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8c60: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
8c70: 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31   NEVER(p->nCol<1
8c80: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d  ) ) return;.  p-
8c90: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
8ca0: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  .notNull = (u8)o
8cb0: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
8cc0: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
8cd0: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
8ce0: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
8cf0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
8d00: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
8d10: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
8d20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
8d30: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
8d40: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
8d50: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
8d60: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
8d70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
8d80: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
8d90: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
8da0: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
8db0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
8dc0: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
8dd0: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
8de0: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
8df0: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
8e00: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
8e10: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
8e20: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
8e30: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
8e40: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
8e50: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
8e60: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
8e70: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
8e80: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
8e90: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
8ea0: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
8ed0: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
8ee0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8ef0: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
8f00: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f10: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
8f20: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8f30: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
8f40: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8f50: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
8f60: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
8f70: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
8f80: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
8f90: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8fa0: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
8fb0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
8fc0: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
8fd0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8fe0: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
8ff0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
9000: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
9010: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
9020: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
9030: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
9040: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
9050: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
9060: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
9070: 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74 29  zIn, u8 *pszEst)
9080: 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20  {.  u32 h = 0;. 
9090: 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49   char aff = SQLI
90a0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
90b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
90c0: 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  har = 0;..  if( 
90d0: 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  zIn==0 ) return 
90e0: 61 66 66 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  aff;.  while( zI
90f0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
9100: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
9110: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9120: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
9130: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
9140: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
9150: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9160: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9170: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9180: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9190: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
91a0: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
91b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
91c0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
91d0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
91e0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
91f0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
9200: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9210: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9220: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
9230: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
9240: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
9250: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
9260: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9270: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9280: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9290: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
92a0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
92b0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
92c0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
92d0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
92e0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
92f0: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
9300: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9310: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
9320: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
9330: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
9340: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9350: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
9360: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9370: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9380: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9390: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
93a0: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
93b0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
93c0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
93d0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
93e0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
93f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9400: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
9410: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9420: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9430: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
9440: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9450: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9460: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9470: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9480: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9490: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
94a0: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
94b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
94c0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
94d0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
94e0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
94f0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9500: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9510: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9520: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9530: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9540: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9550: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9560: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9570: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9590: 20 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f   If pszEst is no
95a0: 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e  t NULL, store an
95b0: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
95c0: 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68   field size.  Th
95d0: 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20  e.  ** estimate 
95e0: 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61  is scaled so tha
95f0: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  t the size of an
9600: 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20   integer is 1.  
9610: 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20  */.  if( pszEst 
9620: 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d  ){.    *pszEst =
9630: 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74   1;   /* default
9640: 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20   size is approx 
9650: 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  4 bytes */.    i
9660: 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46  f( aff<SQLITE_AF
9670: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9680: 20 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a     if( zChar ){.
9690: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
96a0: 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  Char[0] ){.     
96b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
96c0: 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d  Isdigit(zChar[0]
96d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
96e0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20   int v = 0;.    
96f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
9700: 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26  etInt32(zChar, &
9710: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
9720: 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20  v = v/4 + 1;.   
9730: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 32           if( v>2
9740: 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20  55 ) v = 255;.  
9750: 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73            *pszEs
9760: 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b  t = v; /* BLOB(k
9770: 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43  ), VARCHAR(k), C
9780: 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34  HAR(k) -> r=(k/4
9790: 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  +1) */.         
97a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
97b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
97c0: 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20  zChar++;.       
97d0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
97e0: 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20          *pszEst 
97f0: 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20  = 5;   /* BLOB, 
9800: 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d  TEXT, CLOB -> r=
9810: 35 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79  5  (approx 20 by
9820: 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  tes)*/.      }. 
9830: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9840: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
9850: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
9860: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
9870: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
9880: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
9890: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
98a0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
98b0: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
98c0: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
98d0: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
98e0: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
98f0: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
9900: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
9910: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
9920: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9930: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
9940: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
9950: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
9960: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
9970: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
9980: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
9990: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
99a0: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
99b0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
99c0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
99d0: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
99e0: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
99f0: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
9a00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
9a10: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
9a20: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
9a30: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d  mn *pCol;..  p =
9a40: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9a50: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
9a60: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
9a70: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
9a80: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
9a90: 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73  ->nCol-1];.  ass
9aa0: 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  ert( pCol->zType
9ab0: 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a  ==0 );.  pCol->z
9ac0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Type = sqlite3Na
9ad0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
9ae0: 73 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a  se->db, pType);.
9af0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
9b00: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
9b10: 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79  tyType(pCol->zTy
9b20: 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74  pe, &pCol->szEst
9b30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
9b40: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
9b50: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
9b60: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
9b70: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
9b80: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
9b90: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
9ba0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
9bb0: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
9bc0: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
9bd0: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
9be0: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
9bf0: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
9c00: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
9c10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9c20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9c30: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9c40: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9c50: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
9c60: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9c70: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
9c80: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
9c90: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
9ca0: 70 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e  pParse, ExprSpan
9cb0: 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c   *pSpan){.  Tabl
9cc0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
9cd0: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
9ce0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9cf0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
9d00: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
9d10: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
9d20: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
9d30: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
9d40: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
9d50: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9d60: 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72  ion(pSpan->pExpr
9d70: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
9d80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9d90: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9da0: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
9db0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
9dc0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
9dd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
9de0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
9df0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
9e00: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
9e10: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
9e20: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
9e30: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
9e40: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
9e50: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
9e60: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20  olatile memory. 
9e70: 54 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68  The 'span' of th
9e80: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  e expression.   
9e90: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
9ea0: 64 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c  d by pragma tabl
9eb0: 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f  e_info..      */
9ec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9ed0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
9ee0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
9ef0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73   pCol->pDflt = s
9f00: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9f10: 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20  , pSpan->pExpr, 
9f20: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
9f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9f40: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
9f50: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f  Dflt);.      pCo
9f60: 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74  l->zDflt = sqlit
9f70: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
9f80: 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53  (char*)pSpan->zS
9f90: 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tart,.          
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
9fc0: 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70  (pSpan->zEnd - p
9fd0: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a  Span->zStart));.
9fe0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
9ff0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
a000: 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b  , pSpan->pExpr);
a010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e  .}../*.** Design
a020: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
a030: 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c  KEY for the tabl
a040: 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c  e.  pList is a l
a050: 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a  ist of names .**
a060: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74   of columns that
a070: 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72   form the primar
a080: 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74  y key.  If pList
a090: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
a0a0: 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
a0b0: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
a0c0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
a0d0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
a0e0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20  ..**.** A table 
a0f0: 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74  can have at most
a100: 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79   one primary key
a110: 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  .  If the table 
a120: 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61  already has.** a
a130: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e   primary key (an
a140: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  d this is the se
a150: 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79  cond primary key
a160: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  ) then create an
a170: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a  .** error..**.**
a180: 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   If the PRIMARY 
a190: 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67  KEY is on a sing
a1a0: 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  le column whose 
a1b0: 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45  datatype is INTE
a1c0: 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20  GER,.** then we 
a1d0: 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20  will try to use 
a1e0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74  that column as t
a1f0: 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74  he rowid.  Set t
a200: 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a  he Table.iPKey.*
a210: 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74  * field of the t
a220: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
a230: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68  ruction to be th
a240: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a  e index of the.*
a250: 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  * INTEGER PRIMAR
a260: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54  Y KEY column.  T
a270: 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65  able.iPKey is se
a280: 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65  t to -1 if there
a290: 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45   is.** no INTEGE
a2a0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
a2b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20  *.** If the key 
a2c0: 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45  is not an INTEGE
a2d0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74  R PRIMARY KEY, t
a2e0: 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69  hen create a uni
a2f0: 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72  que.** index for
a300: 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e   the key.  No in
a310: 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66  dex is created f
a320: 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  or INTEGER PRIMA
a330: 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64  RY KEYs..*/.void
a340: 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
a350: 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  ryKey(.  Parse *
a360: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
a370: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
a380: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
a390: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
a3a0: 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62  field names to b
a3b0: 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
a3c0: 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
a3d0: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
a3e0: 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73  ith a uniqueness
a3f0: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
a400: 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20  nt autoInc,     
a410: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
a420: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
a430: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
a440: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
a450: 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54  der     /* SQLIT
a460: 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49  E_SO_ASC or SQLI
a470: 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b  TE_SO_DESC */.){
a480: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
a490: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a4a0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70  le;.  char *zTyp
a4b0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  e = 0;.  int iCo
a4c0: 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74  l = -1, i;.  int
a4d0: 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54   nTerm;.  if( pT
a4e0: 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c  ab==0 || IN_DECL
a4f0: 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20  ARE_VTAB ) goto 
a500: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
a510: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  ;.  if( pTab->ta
a520: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
a530: 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20  rimaryKey ){.   
a540: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a550: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
a560: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
a570: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
a580: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
a590: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
a5a0: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
a5b0: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
a5c0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
a5d0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b  F_HasPrimaryKey;
a5e0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
a5f0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
a600: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
a610: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
a620: 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l].colFlags |= C
a630: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
a640: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
a650: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
a660: 70 65 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  pe;.    nTerm = 
a670: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
a680: 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e  nTerm = pList->n
a690: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
a6a0: 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
a6b0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c  {.      for(iCol
a6c0: 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
a6d0: 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
a6e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a6f0: 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
a700: 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62  a[i].zName, pTab
a710: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
a720: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
a730: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
a740: 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col].colFlags |=
a750: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
a760: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
a770: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
a780: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
a790: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a7b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
a7c0: 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a 54  Term==1.   && zT
a7d0: 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ype && sqlite3St
a7e0: 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e  rICmp(zType, "IN
a7f0: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26  TEGER")==0.   &&
a800: 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49   sortOrder==SQLI
a810: 54 45 5f 53 4f 5f 41 53 43 0a 20 20 29 7b 0a 20  TE_SO_ASC.  ){. 
a820: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
a830: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
a840: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
a850: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
a860: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
a870: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
a880: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
a890: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
a8a0: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
a8b0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
a8c0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
a8d0: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
a8e0: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
a8f0: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
a900: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
a910: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
a920: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
a930: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a940: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
a950: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
a960: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
a970: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
a980: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
a990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62    }else{.    Vdb
a9a0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a9b0: 56 64 62 65 3b 0a 20 20 20 20 49 6e 64 65 78 20  Vdbe;.    Index 
a9c0: 2a 70 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20  *p;.    if( v ) 
a9d0: 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b 69 70  pParse->addrSkip
a9e0: 50 4b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  PK = sqlite3Vdbe
a9f0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f  AddOp0(v, OP_Noo
aa00: 70 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  p);.    p = sqli
aa10: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
aa20: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
aa30: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
aa40: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
aa60: 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a   sortOrder, 0);.
aa70: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
aa80: 20 20 20 70 2d 3e 69 64 78 54 79 70 65 20 3d 20     p->idxType = 
aa90: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
aaa0: 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 20  RIMARYKEY;.     
aab0: 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33   if( v ) sqlite3
aac0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
aad0: 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b 69 70  pParse->addrSkip
aae0: 50 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  PK);.    }.    p
aaf0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70  List = 0;.  }..p
ab00: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a  rimary_key_exit:
ab10: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
ab20: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
ab30: 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72  >db, pList);.  r
ab40: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
ab50: 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20  Add a new CHECK 
ab60: 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68  constraint to th
ab70: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
ab80: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
ab90: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
aba0: 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e  lite3AddCheckCon
abb0: 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
abc0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
abd0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
abe0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63  */.  Expr *pChec
abf0: 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68  kExpr  /* The ch
ac00: 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  eck expression *
ac10: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
ac20: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
ac30: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
ac40: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
ac50: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ac60: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ac70: 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f  if( pTab && !IN_
ac80: 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20  DECLARE_VTAB.   
ac90: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
aca0: 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61  IsReadonly(db->a
acb0: 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d  Db[db->init.iDb]
acc0: 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70  .pBt).  ){.    p
acd0: 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71  Tab->pCheck = sq
ace0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
acf0: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61 62  end(pParse, pTab
ad00: 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b  ->pCheck, pCheck
ad10: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Expr);.    if( p
ad20: 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e  Parse->constrain
ad30: 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20  tName.n ){.     
ad40: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ad50: 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
ad60: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70  pTab->pCheck, &p
ad70: 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e  Parse->constrain
ad80: 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d  tName, 1);.    }
ad90: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
ada0: 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45    {.    sqlite3E
adb0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
adc0: 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72  ->db, pCheckExpr
add0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ade0: 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  Set the collatio
adf0: 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68  n function of th
ae00: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
ae10: 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c  parsed table col
ae20: 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f  umn.** to the Co
ae30: 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a  llSeq given..*/.
ae40: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
ae50: 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65  ollateType(Parse
ae60: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
ae70: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c  *pToken){.  Tabl
ae80: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
ae90: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
aea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
aeb0: 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63  quoted name of c
aec0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
aed0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
aee0: 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20  db;..  if( (p = 
aef0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
af00: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
af10: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
af20: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
af30: 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  db;.  zColl = sq
af40: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
af50: 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
af60: 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
af70: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71  eturn;..  if( sq
af80: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
af90: 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
afa0: 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  ) ){.    Index *
afb0: 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65  pIdx;.    sqlite
afc0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
afd0: 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20  Col[i].zColl);. 
afe0: 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43     p->aCol[i].zC
aff0: 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a  oll = zColl;.  .
b000: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
b010: 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64  lumn is declared
b020: 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d   as "<name> PRIM
b030: 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20  ARY KEY COLLATE 
b040: 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20  <type>",.    ** 
b050: 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61  then an index ma
b060: 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61  y have been crea
b070: 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75  ted on this colu
b080: 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  mn before the.  
b090: 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74    ** collation t
b0a0: 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43  ype was added. C
b0b0: 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69  orrect this if i
b0c0: 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  t is the case.. 
b0d0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49     */.    for(pI
b0e0: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
b0f0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
b100: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
b110: 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43  ert( pIdx->nKeyC
b120: 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  ol==1 );.      i
b130: 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
b140: 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20  n[0]==i ){.     
b150: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
b160: 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  0] = p->aCol[i].
b170: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  zColl;.      }. 
b180: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
b190: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
b1a0: 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, zColl);.  }.
b1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b1c0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
b1d0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
b1e0: 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61  uence for databa
b1f0: 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a  se native text.*
b200: 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74  * encoding ident
b210: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72  ified by the str
b220: 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74  ing zName, lengt
b230: 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  h nName..**.** I
b240: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
b250: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b260: 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ce is not availa
b270: 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69  ble, or not avai
b280: 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20  lable.** in the 
b290: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
b2a0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f  encoding, the co
b2b0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
b2c0: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a  is invoked to.**
b2d0: 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20   request it. If 
b2e0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
b2f0: 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73  ctory does not s
b300: 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71  upply such a seq
b310: 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68  uence,.** and th
b320: 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76  e sequence is av
b330: 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  ailable in anoth
b340: 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  er text encoding
b350: 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a  , then that is.*
b360: 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  * returned inste
b370: 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  ad..**.** If no 
b380: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
b390: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
b3a0: 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72  ions sequence ar
b3b0: 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a  e available, or.
b3c0: 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72  ** another error
b3d0: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
b3e0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
b3f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
b400: 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70  ritten into.** p
b410: 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Parse..**.** Thi
b420: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77  s routine is a w
b430: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
b440: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
b450: 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
b460: 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65  e.** invokes the
b470: 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f   collation facto
b480: 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ry if the named 
b490: 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  collation cannot
b4a0: 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64   be found.** and
b4b0: 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72   generates an er
b4c0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a  ror message..**.
b4d0: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c  ** See also: sql
b4e0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
b4f0: 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c  ), sqlite3GetCol
b500: 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65  lSeq().*/.CollSe
b510: 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  q *sqlite3Locate
b520: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
b530: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
b540: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c  r *zName){.  sql
b550: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b560: 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20  e->db;.  u8 enc 
b570: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20  = ENC(db);.  u8 
b580: 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69  initbusy = db->i
b590: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
b5a0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70  Seq *pColl;..  p
b5b0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
b5c0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  ndCollSeq(db, en
b5d0: 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75  c, zName, initbu
b5e0: 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74  sy);.  if( !init
b5f0: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
b600: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
b610: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
b620: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
b630: 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70  q(pParse, enc, p
b640: 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Coll, zName);.  
b650: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  }..  return pCol
b660: 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  l;.}.../*.** Gen
b670: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
b680: 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74  will increment t
b690: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
b6a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65  ..**.** The sche
b6b0: 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65  ma cookie is use
b6c0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
b6d0: 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66  hen the schema f
b6e0: 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  or the.** databa
b6f0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74  se changes.  Aft
b700: 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63  er each schema c
b710: 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69  hange, the cooki
b720: 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67  e value.** chang
b730: 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63  es.  When a proc
b740: 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20  ess first reads 
b750: 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65  the schema it re
b760: 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f  cords the.** coo
b770: 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72  kie.  Thereafter
b780: 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f  , whenever it go
b790: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
b7a0: 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74   database,.** it
b7b0: 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b   checks the cook
b7c0: 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ie to make sure 
b7d0: 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e  the schema has n
b7e0: 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69  ot changed.** si
b7f0: 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20  nce it was last 
b800: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
b810: 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d   plan is not com
b820: 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70  pletely bullet-p
b830: 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73  roof.  It is pos
b840: 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65  sible for.** the
b850: 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67   schema to chang
b860: 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  e multiple times
b870: 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f   and for the coo
b880: 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74  kie to be.** set
b890: 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76   back to prior v
b8a0: 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d  alue.  But schem
b8b0: 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e  a changes are in
b8c0: 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20  frequent.** and 
b8d0: 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20  the probability 
b8e0: 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73  of hitting the s
b8f0: 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ame cookie value
b900: 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68   is only.** 1 ch
b910: 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53  ance in 2^32.  S
b920: 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f  o we're safe eno
b930: 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ugh..*/.void sql
b940: 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
b950: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
b960: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
b970: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
b980: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
b990: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b9a0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64  pParse->db;.  Vd
b9b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
b9c0: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
b9d0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
b9e0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
b9f0: 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33   0) );.  sqlite3
ba00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ba10: 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44  _Integer, db->aD
ba20: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
ba30: 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c  schema_cookie+1,
ba40: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
ba50: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ba60: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
ba70: 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52  BTREE_SCHEMA_VER
ba80: 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  SION, r1);.  sql
ba90: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
baa0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
bab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
bac0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
bad0: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
bae0: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
baf0: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
bb00: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
bb10: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
bb20: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
bb30: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
bb40: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
bb50: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
bb60: 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
bb70: 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76  e is conservativ
bb80: 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  e.  It might be 
bb90: 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74  larger that what
bba0: 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65   is.** really ne
bbb0: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
bbc0: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
bbd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
bbe0: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
bbf0: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
bc00: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
bc10: 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  "' ){ n++; }.  }
bc20: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b  .  return n + 2;
bc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
bc40: 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  rst parameter is
bc50: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
bc60: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
bc70: 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70  The second .** p
bc80: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
bc90: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65  inter to an inte
bca0: 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ger that contain
bcb0: 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a  s the offset at.
bcc0: 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69 74  ** which to writ
bcd0: 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
bce0: 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66  t buffer. This f
bcf0: 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74  unction copies t
bd00: 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  he.** nul-termin
bd10: 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e  ated string poin
bd20: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74 68  ted to by the th
bd30: 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a  ird parameter, z
bd40: 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20  SignedIdent,.** 
bd50: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
bd60: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 62   offset in the b
bd70: 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74 65  uffer and update
bd80: 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72  s *pIdx to refer
bd90: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
bda0: 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20   byte after the 
bdb0: 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65  last byte writte
bdc0: 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
bdd0: 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ng..** .** If th
bde0: 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64  e string zSigned
bdf0: 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65  Ident consists e
be00: 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61  ntirely of alpha
be10: 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72  -numeric.** char
be20: 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74  acters, does not
be30: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64 69   begin with a di
be40: 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61  git and is not a
be50: 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a  n SQL keyword,.*
be60: 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  * then it is cop
be70: 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ied to the outpu
be80: 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c 79  t buffer exactly
be90: 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72   as it is. Other
bea0: 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71  wise,.** it is q
beb0: 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62  uoted using doub
bec0: 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74  le-quotes..*/.st
bed0: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
bee0: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
bef0: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
bf00: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
bf10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
bf20: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
bf30: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
bf40: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
bf50: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
bf60: 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a   *pIdx;..  for(j
bf70: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
bf80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71  ++){.    if( !sq
bf90: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64  lite3Isalnum(zId
bfa0: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
bfb0: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
bfc0: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
bfd0: 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69  te = sqlite3Isdi
bfe0: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
bff0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
c000: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
c010: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
c020: 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ID.            |
c030: 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20  | zIdent[j]!=0. 
c040: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d             || j=
c050: 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51  =0;..  if( needQ
c060: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
c070: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
c080: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
c090: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
c0a0: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
c0b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
c0c0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
c0d0: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
c0e0: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
c0f0: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
c100: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
c110: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
c120: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
c130: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
c140: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
c150: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
c160: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
c170: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
c180: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
c190: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
c1a0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
c1b0: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
c1c0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
c1d0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
c1e0: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
c1f0: 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tmt(sqlite3 *db,
c200: 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e   Table *p){.  in
c210: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
c220: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
c230: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
c240: 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20  *zEnd;.  Column 
c250: 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *pCol;.  n = 0;.
c260: 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e    for(pCol = p->
c270: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
c280: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
c290: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
c2a0: 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a  ntLength(pCol->z
c2b0: 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20  Name) + 5;.  }. 
c2c0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
c2d0: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
c2e0: 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20  f( n<50 ){ .    
c2f0: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
c300: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
c310: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
c320: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
c330: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
c340: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
c350: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
c360: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
c370: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
c380: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
c390: 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20  locRaw(0, n);.  
c3a0: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( zStmt==0 ){.
c3b0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
c3c0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
c3d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
c3e0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
c3f0: 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45  , zStmt, "CREATE
c400: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
c410: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c420: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
c430: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
c440: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
c450: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
c460: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
c470: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
c480: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c490: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
c4a0: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
c4b0: 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Type[] = {.     
c4c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c4d0: 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a  _NONE    */ "",.
c4e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
c4f0: 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f  E_AFF_TEXT    */
c500: 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20   " TEXT",.      
c510: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
c520: 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d  NUMERIC */ " NUM
c530: 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51  ",.        /* SQ
c540: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
c550: 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20   */ " INT",.    
c560: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c570: 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52  F_REAL    */ " R
c580: 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20  EAL".    };.    
c590: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e  int len;.    con
c5a0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
c5b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
c5c0: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
c5d0: 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20  t[k], zSep);.   
c5e0: 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   k += sqlite3Str
c5f0: 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29  len30(&zStmt[k])
c600: 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65  ;.    zSep = zSe
c610: 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74  p2;.    identPut
c620: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c  (zStmt, &k, pCol
c630: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73  ->zName);.    as
c640: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
c650: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
c660: 4e 4f 4e 45 20 3e 3d 20 30 20 29 3b 0a 20 20 20  NONE >= 0 );.   
c670: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
c680: 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41  ffinity-SQLITE_A
c690: 46 46 5f 4e 4f 4e 45 20 3c 20 41 72 72 61 79 53  FF_NONE < ArrayS
c6a0: 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20  ize(azType) );. 
c6b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
c6c0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c6d0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a  ITE_AFF_NONE );.
c6e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
c6f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c700: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b  LITE_AFF_TEXT );
c710: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c720: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c730: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
c740: 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  C );.    testcas
c750: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c760: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  y==SQLITE_AFF_IN
c770: 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73  TEGER );.    tes
c780: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c790: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c7a0: 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20  F_REAL );.    . 
c7b0: 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70     zType = azTyp
c7c0: 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  e[pCol->affinity
c7d0: 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   - SQLITE_AFF_NO
c7e0: 4e 45 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  NE];.    len = s
c7f0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c800: 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Type);.    asser
c810: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
c820: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  y==SQLITE_AFF_NO
c830: 4e 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  NE .            
c840: 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  || pCol->affinit
c850: 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69  y==sqlite3Affini
c860: 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29  tyType(zType, 0)
c870: 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   );.    memcpy(&
c880: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c  zStmt[k], zType,
c890: 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20   len);.    k += 
c8a0: 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  len;.    assert(
c8b0: 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73   k<=n );.  }.  s
c8c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c8d0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
c8e0: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
c8f0: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
c900: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20  /*.** Resize an 
c910: 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20  Index object to 
c920: 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74  hold N columns t
c930: 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51  otal.  Return SQ
c940: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
c950: 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45  ccess and SQLITE
c960: 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d  _NOMEM on an OOM
c970: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
c980: 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65  c int resizeInde
c990: 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  xObject(sqlite3 
c9a0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
c9b0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72  , int N){.  char
c9c0: 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20   *zExtra;.  int 
c9d0: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64  nByte;.  if( pId
c9e0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20  x->nColumn>=N ) 
c9f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ca00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
ca10: 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29  ->isResized==0 )
ca20: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a  ;.  nByte = (siz
ca30: 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a  eof(char*) + siz
ca40: 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b  eof(i16) + 1)*N;
ca50: 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69  .  zExtra = sqli
ca60: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
ca70: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
ca80: 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65  ( zExtra==0 ) re
ca90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
caa0: 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  M;.  memcpy(zExt
cab0: 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  ra, pIdx->azColl
cac0: 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  , sizeof(char*)*
cad0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
cae0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
caf0: 20 28 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b   (char**)zExtra;
cb00: 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a  .  zExtra += siz
cb10: 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20  eof(char*)*N;.  
cb20: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
cb30: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73  Idx->aiColumn, s
cb40: 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d  izeof(i16)*pIdx-
cb50: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
cb60: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
cb70: 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45  16*)zExtra;.  zE
cb80: 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69  xtra += sizeof(i
cb90: 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28  16)*N;.  memcpy(
cba0: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53  zExtra, pIdx->aS
cbb0: 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e  ortOrder, pIdx->
cbc0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
cbd0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
cbe0: 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49  u8*)zExtra;.  pI
cbf0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b  dx->nColumn = N;
cc00: 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a  .  pIdx->isResiz
cc10: 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  ed = 1;.  return
cc20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
cc30: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
cc40: 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74  e total row widt
cc50: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a  h for a table..*
cc60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
cc70: 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
cc80: 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20  (Table *pTab){. 
cc90: 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65   unsigned wTable
cca0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f   = 0;.  const Co
ccb0: 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20  lumn *pTabCol;. 
ccc0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
ccd0: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
cce0: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
ccf0: 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f  i>0; i--, pTabCo
cd00: 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65  l++){.    wTable
cd10: 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45   += pTabCol->szE
cd20: 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  st;.  }.  if( pT
cd30: 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54  ab->iPKey<0 ) wT
cd40: 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e  able++;.  pTab->
cd50: 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74  szTabRow = sqlit
cd60: 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a  e3LogEst(wTable*
cd70: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  4);.}../*.** Est
cd80: 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
cd90: 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20  e size of a row 
cda0: 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f  for an index..*/
cdb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
cdc0: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
cdd0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
cde0: 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20  unsigned wIndex 
cdf0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
ce00: 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43  const Column *aC
ce10: 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ol = pIdx->pTabl
ce20: 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69  e->aCol;.  for(i
ce30: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
ce40: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
ce50: 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  16 x = pIdx->aiC
ce60: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73  olumn[i];.    as
ce70: 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54  sert( x<pIdx->pT
ce80: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  able->nCol );.  
ce90: 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20    wIndex += x<0 
cea0: 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d  ? 1 : aCol[pIdx-
ceb0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a  >aiColumn[i]].sz
cec0: 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d  Est;.  }.  pIdx-
ced0: 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69  >szIdxRow = sqli
cee0: 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78  te3LogEst(wIndex
cef0: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  *4);.}../* Retur
cf00: 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65 20  n true if value 
cf10: 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f  x is found any o
cf20: 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c  f the first nCol
cf30: 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f   entries of aiCo
cf40: 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l[].*/.static in
cf50: 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73  t hasColumn(cons
cf60: 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e  t i16 *aiCol, in
cf70: 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a  t nCol, int x){.
cf80: 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20    while( nCol-- 
cf90: 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61  > 0 ) if( x==*(a
cfa0: 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e  iCol++) ) return
cfb0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
cfc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
cfd0: 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68  utine runs at th
cfe0: 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67  e end of parsing
cff0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
d000: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a  statement that.*
d010: 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20  * has a WITHOUT 
d020: 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54  ROWID clause.  T
d030: 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
d040: 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e  outine is to con
d050: 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74  vert both.** int
d060: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74  ernal schema dat
d070: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64  a structures and
d080: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56   the generated V
d090: 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74  DBE code so that
d0a0: 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70   they.** are app
d0b0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57  ropriate for a W
d0c0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
d0d0: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  le instead of a 
d0e0: 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20  rowid table..** 
d0f0: 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a  Changes include:
d100: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
d110: 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43  Convert the OP_C
d120: 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f 20  reateTable into 
d130: 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  an OP_CreateInde
d140: 78 2e 20 20 54 68 65 72 65 20 69 73 0a 2a 2a 20  x.  There is.** 
d150: 20 20 20 20 20 20 20 20 20 6e 6f 20 72 6f 77 69           no rowi
d160: 64 20 62 74 72 65 65 20 66 6f 72 20 61 20 57 49  d btree for a WI
d170: 54 48 4f 55 54 20 52 4f 57 49 44 2e 20 20 49 6e  THOUT ROWID.  In
d180: 73 74 65 61 64 2c 20 74 68 65 20 63 61 6e 6f 6e  stead, the canon
d190: 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ical.**         
d1a0: 20 64 61 74 61 20 73 74 6f 72 61 67 65 20 69 73   data storage is
d1b0: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
d1c0: 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20 20  x btree..**     
d1d0: 28 32 29 20 20 42 79 70 61 73 73 20 74 68 65 20  (2)  Bypass the 
d1e0: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
d1f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
d200: 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20  ble entry.**    
d210: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52        for the PR
d220: 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65  IMARY KEY as the
d230: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
d240: 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20  ex is now.**    
d250: 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64        identified
d260: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   by the sqlite_m
d270: 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72  aster table entr
d280: 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  y of the table i
d290: 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33  tself..**     (3
d2a0: 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78  )  Set the Index
d2b0: 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49  .tnum of the PRI
d2c0: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f  MARY KEY Index o
d2d0: 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
d2e0: 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20           schema 
d2f0: 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  to the rootpage 
d300: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61  from the main ta
d310: 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20  ble..**     (4) 
d320: 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73   Set all columns
d330: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
d340: 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  KEY schema objec
d350: 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c  t to be NOT NULL
d360: 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64  ..**     (5)  Ad
d370: 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75  d all table colu
d380: 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41  mns to the PRIMA
d390: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
d3a0: 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ect.**          
d3b0: 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d  so that the PRIM
d3c0: 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76  ARY KEY is a cov
d3d0: 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68  ering index.  Th
d3e0: 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20  e surplus.**    
d3f0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72        columns ar
d400: 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66  e part of KeyInf
d410: 6f 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72  o.nXField and ar
d420: 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a  e not used for.*
d430: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69  *          sorti
d440: 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20  ng or lookup or 
d450: 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b  uniqueness check
d460: 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52  s..**     (6)  R
d470: 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64  eplace the rowid
d480: 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74   tail on all aut
d490: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
d4a0: 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20  ated UNIQUE.**  
d4b0: 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20          indices 
d4c0: 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59  with the PRIMARY
d4d0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f   KEY columns..*/
d4e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
d4f0: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
d500: 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  idTable(Parse *p
d510: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
d520: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
d530: 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b  dx;.  Index *pPk
d540: 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69  ;.  int nPk;.  i
d550: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
d560: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d570: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
d580: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
d590: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
d5a0: 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  e OP_CreateTable
d5b0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75   opcode that wou
d5c0: 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61  ld normally crea
d5d0: 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74  te the.  ** root
d5e0: 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 74 61  -page for the ta
d5f0: 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43  ble into an OP_C
d600: 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f 64  reateIndex opcod
d610: 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20 20  e.  The index.  
d620: 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20  ** created will 
d630: 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d 41  become the PRIMA
d640: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20  RY KEY index..  
d650: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
d660: 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20  >addrCrTab ){.  
d670: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
d680: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65     sqlite3VdbeGe
d690: 74 4f 70 28 76 2c 20 70 50 61 72 73 65 2d 3e 61  tOp(v, pParse->a
d6a0: 64 64 72 43 72 54 61 62 29 2d 3e 6f 70 63 6f 64  ddrCrTab)->opcod
d6b0: 65 20 3d 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  e = OP_CreateInd
d6c0: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 79  ex;.  }..  /* By
d6d0: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
d6e0: 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  n of the PRIMARY
d6f0: 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74   KEY btree and t
d700: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
d710: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72  .  ** table entr
d720: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
d730: 61 72 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b  arse->addrSkipPK
d740: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d750: 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v );.    sqlite3
d760: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 50 61  VdbeGetOp(v, pPa
d770: 72 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29  rse->addrSkipPK)
d780: 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 47 6f  ->opcode = OP_Go
d790: 74 6f 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  to;.  }..  /* Lo
d7a0: 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  cate the PRIMARY
d7b0: 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c   KEY index.  Or,
d7c0: 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77   if this table w
d7d0: 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20  as originally.  
d7e0: 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ** an INTEGER PR
d7f0: 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c  IMARY KEY table,
d800: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52   create a new PR
d810: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
d820: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
d830: 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
d840: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
d850: 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  st;.    pList = 
d860: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
d870: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
d880: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69   0);.    if( pLi
d890: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
d8a0: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
d8b0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
d8c0: 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
d8d0: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
d900: 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
d910: 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
d920: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
d930: 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Order = pParse->
d940: 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  iPkSortOrder;.  
d950: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
d960: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61  ->pNewTable==pTa
d970: 62 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73  b );.    pPk = s
d980: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
d990: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
d9a0: 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e  0, pList, pTab->
d9b0: 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30  keyConf, 0, 0, 0
d9c0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 0);.    if( pP
d9d0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  k==0 ) return;. 
d9e0: 20 20 20 70 50 6b 2d 3e 69 64 78 54 79 70 65 20     pPk->idxType 
d9f0: 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  = SQLITE_IDXTYPE
da00: 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20  _PRIMARYKEY;.   
da10: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
da20: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
da30: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
da40: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
da50: 62 29 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69  b);.  }.  pPk->i
da60: 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
da70: 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20   assert( pPk!=0 
da80: 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e  );.  nPk = pPk->
da90: 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d  nKeyCol;..  /* M
daa0: 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 63  ake sure every c
dab0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50 52 49  olumn of the PRI
dac0: 4d 41 52 59 20 4b 45 59 20 69 73 20 4e 4f 54 20  MARY KEY is NOT 
dad0: 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  NULL */.  for(i=
dae0: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
daf0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
db00: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Pk->aiColumn[i]]
db10: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  .notNull = 1;.  
db20: 7d 0a 20 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74  }.  pPk->uniqNot
db30: 4e 75 6c 6c 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  Null = 1;..  /* 
db40: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
db50: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
db60: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f   is the table ro
db70: 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b  ot page */.  pPk
db80: 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74  ->tnum = pTab->t
db90: 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74  num;..  /* Updat
dba0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
dbb0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
dbc0: 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64  f all UNIQUE ind
dbd0: 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69  ices by converti
dbe0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  ng.  ** the fina
dbf0: 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69  l rowid column i
dc00: 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
dc10: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50  columns of the P
dc20: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f  RIMARY KEY..  */
dc30: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
dc40: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
dc50: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
dc60: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
dc70: 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b    if( IsPrimaryK
dc80: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  eyIndex(pIdx) ) 
dc90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
dca0: 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20  r(i=n=0; i<nPk; 
dcb0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
dcc0: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
dcd0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
dce0: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
dcf0: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b  iColumn[i]) ) n+
dd00: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
dd10: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f   n==0 ){.      /
dd20: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20  * This index is 
dd30: 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74 68  a superset of th
dd40: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
dd50: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f  .      pIdx->nCo
dd60: 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  lumn = pIdx->nKe
dd70: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74  yCol;.      cont
dd80: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
dd90: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
dda0: 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20  bject(db, pIdx, 
ddb0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29  pIdx->nKeyCol+n)
ddc0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
ddd0: 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e  or(i=0, j=pIdx->
dde0: 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20  nKeyCol; i<nPk; 
ddf0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
de00: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
de10: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
de20: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
de30: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
de40: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
de50: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e  olumn[j] = pPk->
de60: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
de70: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
de80: 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[j] = pPk->azCo
de90: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a  ll[i];.        j
dea0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
deb0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  }.    assert( pI
dec0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64  dx->nColumn>=pId
ded0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a  x->nKeyCol+n );.
dee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
def0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a  ->nColumn>=j );.
df00: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c    }..  /* Add al
df10: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
df20: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
df30: 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20  EY index.  */.  
df40: 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43  if( nPk<pTab->nC
df50: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  ol ){.    if( re
df60: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
df70: 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e  db, pPk, pTab->n
df80: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  Col) ) return;. 
df90: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50     for(i=0, j=nP
dfa0: 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  k; i<pTab->nCol;
dfb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
dfc0: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d   !hasColumn(pPk-
dfd0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29  >aiColumn, j, i)
dfe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
dff0: 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75  rt( j<pPk->nColu
e000: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  mn );.        pP
e010: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  k->aiColumn[j] =
e020: 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   i;.        pPk-
e030: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49  >azColl[j] = "BI
e040: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6a  NARY";.        j
e050: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
e060: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
e070: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b  k->nColumn==j );
e080: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
e090: 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20  b->nCol==j );.  
e0a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e  }else{.    pPk->
e0b0: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e  nColumn = pTab->
e0c0: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
e0d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e0e0: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
e0f0: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
e100: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
e110: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
e120: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
e130: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
e140: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
e150: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
e160: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
e170: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
e180: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
e190: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
e1a0: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
e1b0: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
e1c0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
e1d0: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
e1e0: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
e1f0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
e200: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
e210: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
e220: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
e230: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
e240: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
e250: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
e260: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
e270: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
e280: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
e290: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
e2a0: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
e2b0: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
e2c0: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
e2d0: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
e2e0: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
e2f0: 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  d, so the entry 
e300: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
e310: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
e320: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
e330: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
e340: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
e350: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
e360: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
e370: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
e380: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
e390: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
e3a0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
e3b0: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
e3c0: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
e3d0: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
e3e0: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
e3f0: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
e400: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
e410: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
e420: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
e430: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
e440: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
e450: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
e460: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a  qlite3EndTable(.
e470: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
e490: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
e4a0: 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20  Token *pCons,   
e4b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
e4c0: 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ,' token after t
e4d0: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64  he last column d
e4e0: 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  efn. */.  Token 
e4f0: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
e500: 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66    /* The ')' bef
e510: 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74  ore options in t
e520: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
e530: 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c  */.  u8 tabOpts,
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e550: 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69  Extra table opti
e560: 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20  ons. Usually 0. 
e570: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
e580: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
e590: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
e5a0: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
e5b0: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
e5c0: 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  le *p;          
e5d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
e5e0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
e5f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e600: 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
e610: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e620: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20   /* Database in 
e650: 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20  which the table 
e660: 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78  lives */.  Index
e670: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
e680: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69       /* An impli
e690: 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ed index of the 
e6a0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20  table */..  if( 
e6b0: 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c  (pEnd==0 && pSel
e6c0: 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d  ect==0) || db->m
e6d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
e6e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
e6f0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
e700: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
e710: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
e720: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
e730: 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65  t.busy || !pSele
e740: 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ct );..  /* If t
e750: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
e760: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
e770: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
e780: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
e790: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
e7a0: 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65  r" or "sqlite_te
e7b0: 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  mp_master" table
e7c0: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20   on the disk..  
e7d0: 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  ** So do not wri
e7e0: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  te to the disk a
e7f0: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
e800: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
e810: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
e820: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
e830: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
e840: 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
e850: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
e860: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
e870: 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
e880: 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
e890: 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69  utine.).  */.  i
e8a0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
e8b0: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
e8c0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
e8d0: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  um;.  }..  /* Sp
e8e0: 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
e8f0: 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
e900: 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69  ID Tables */.  i
e910: 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f  f( tabOpts & TF_
e920: 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a  WithoutRowid ){.
e930: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
e940: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
e950: 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20  crement) ){.    
e960: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e970: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
e980: 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45      "AUTOINCREME
e990: 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  NT not allowed o
e9a0: 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  n WITHOUT ROWID 
e9b0: 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
e9c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
e9d0: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
e9e0: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
e9f0: 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ryKey)==0 ){.   
ea00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ea10: 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d  sg(pParse, "PRIM
ea20: 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20  ARY KEY missing 
ea30: 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d  on table %s", p-
ea40: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
ea50: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62  se{.      p->tab
ea60: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68  Flags |= TF_With
ea70: 6f 75 74 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  outRowid;.      
ea80: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
ea90: 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73  RowidTable(pPars
eaa0: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
eab0: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
eac0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
ead0: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
eae0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eaf0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
eb00: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
eb10: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
eb20: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
eb30: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
eb40: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
eb50: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
eb60: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
eb70: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
eb80: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
eb90: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
eba0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ebb0: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
ebc0: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
ebd0: 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
ebe0: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
ebf0: 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
ec00: 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
ec10: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
ec20: 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
ec30: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
ec40: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
ec50: 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
ec60: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
ec70: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
ec80: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
ec90: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
eca0: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
ecb0: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
ecc0: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
ecd0: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
ece0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
ecf0: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
ed00: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
ed10: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
ed20: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
ed30: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
ed40: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
ed50: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
ed60: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
ed70: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
ed80: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
ed90: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
eda0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
edb0: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
edc0: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
edd0: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
ede0: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
edf0: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
ee00: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
ee10: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
ee20: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
ee30: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
ee40: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
ee50: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ee60: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
ee70: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
ee80: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
ee90: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
eea0: 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
eeb0: 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
eec0: 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
eed0: 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
eee0: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
eef0: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
ef00: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
ef10: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
ef20: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
ef30: 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
ef40: 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
ef50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef60: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
ef70: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
ef80: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
ef90: 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
efa0: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
efb0: 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
efc0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
efd0: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
efe0: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
eff0: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
f000: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
f010: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
f020: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
f030: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
f040: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
f050: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
f060: 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
f070: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
f080: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f090: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
f0a0: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
f0b0: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
f0c0: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
f0d0: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
f0e0: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
f0f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
f100: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
f110: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
f120: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
f130: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
f140: 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
f150: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
f160: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
f170: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
f180: 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
f190: 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
f1a0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f1b0: 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
f1c0: 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
f1d0: 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
f1e0: 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
f1f0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
f200: 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
f210: 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
f220: 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
f230: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f240: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
f250: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
f260: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
f270: 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20 61  SelTab;..      a
f280: 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54  ssert(pParse->nT
f290: 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71  ab==1);.      sq
f2a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f2b0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
f2c0: 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52   1, pParse->regR
f2d0: 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  oot, iDb);.     
f2e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
f2f0: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
f300: 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70  2ISREG);.      p
f310: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
f320: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
f330: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
f340: 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  st, SRT_Table, 1
f350: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f360: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f370: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
f380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f390: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
f3a0: 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ose, 1);.      i
f3b0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
f3c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  =0 ){.        pS
f3d0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
f3e0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
f3f0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
f400: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f410: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
f420: 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rn;.        asse
f430: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
f440: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f  ;.        p->nCo
f450: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
f460: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43  l;.        p->aC
f470: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
f480: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  ol;.        pSel
f490: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
f4a0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
f4b0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
f4c0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
f4d0: 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
f4e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f4f0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
f500: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
f510: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
f520: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
f530: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
f540: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
f550: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
f560: 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
f570: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
f580: 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f  End2 = tabOpts ?
f590: 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   &pParse->sLastT
f5a0: 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20  oken : pEnd;.   
f5b0: 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
f5c0: 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  d2->z - pParse->
f5d0: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
f5e0: 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e       if( pEnd2->
f5f0: 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d  z[0]!=';' ) n +=
f600: 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20   pEnd2->n;.     
f610: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
f620: 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
f630: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
f640: 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
f650: 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
f660: 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
f670: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f680: 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
f690: 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
f6a0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
f6b0: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
f6c0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
f6d0: 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
f6e0: 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
f6f0: 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
f700: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
f710: 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
f720: 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
f730: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
f740: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
f750: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
f760: 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
f770: 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
f780: 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
f790: 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
f7a0: 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
f7b0: 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
f7c0: 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
f7d0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
f7e0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
f7f0: 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
f800: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
f810: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
f820: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
f830: 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  oot,.      zStmt
f840: 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
f850: 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a  regRowid.    );.
f860: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f870: 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20  e(db, zStmt);.  
f880: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
f890: 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
f8a0: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
f8b0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
f8c0: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
f8d0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
f8e0: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
f8f0: 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
f900: 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
f910: 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
f920: 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
f930: 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
f940: 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c      if( p->tabFl
f950: 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
f960: 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  rement ){.      
f970: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
f980: 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61  Db[iDb];.      a
f990: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
f9a0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
f9b0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
f9c0: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
f9d0: 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20  ema->pSeqTab==0 
f9e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f9f0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
fa00: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
fa10: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
fa20: 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
fa30: 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20  (name,seq)",.   
fa40: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
fa50: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
fa60: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
fa70: 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73  f..    /* Repars
fa80: 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20  e everything to 
fa90: 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
faa0: 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
fab0: 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  res */.    sqlit
fac0: 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
fad0: 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
fae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
faf0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62  3MPrintf(db, "tb
fb00: 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20  l_name='%q' AND 
fb10: 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
fb20: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  , p->zName));.  
fb30: 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  }...  /* Add the
fb40: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
fb50: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
fb60: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
fb70: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
fb80: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
fb90: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
fba0: 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20  Old;.    Schema 
fbb0: 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53  *pSchema = p->pS
fbc0: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
fbd0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
fbe0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
fbf0: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c  b, 0) );.    pOl
fc00: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
fc10: 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e  nsert(&pSchema->
fc20: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
fc30: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
fc40: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
fc50: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
fc60: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
fc70: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
fc80: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
fc90: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
fca0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
fcb0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
fcc0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
fcd0: 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  NewTable = 0;.  
fce0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
fcf0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
fd00: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
fd10: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
fd20: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
fd30: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
fd40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
fd50: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
fd60: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
fd70: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
fd80: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
fd90: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
fda0: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
fdb0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
fdc0: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
fdd0: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
fde0: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
fdf0: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
fe00: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
fe10: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
fe20: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
fe30: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
fe40: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
fe50: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
fe60: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
fe70: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
fe80: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
fe90: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
fea0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
feb0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
fec0: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
fed0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
fee0: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
fef0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ff00: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
ff10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
ff20: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
ff30: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
ff40: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
ff50: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
ff60: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
ff70: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
ff80: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
ff90: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
ffa0: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
ffb0: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
ffc0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
ffd0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
ffe0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
fff0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
10000 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
10010 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
10020 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
10030 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
10040 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
10050 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
10060 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
10070 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
10080 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
10090 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
100a0 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
100b0 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
100c0 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
100d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
100e0 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62  Token sEnd;.  Db
100f0 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f  Fixer sFix;.  To
10100 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a  ken *pName = 0;.
10110 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
10120 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
10130 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50  e->db;..  if( pP
10140 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a  arse->nVar>0 ){.
10150 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10160 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72  Msg(pParse, "par
10170 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20  ameters are not 
10180 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73  allowed in views
10190 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ");.    sqlite3S
101a0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
101b0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
101c0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
101d0 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
101e0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
101f0 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
10200 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
10210 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
10220 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
10230 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
10240 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
10250 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
10260 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
10270 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
10280 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
10290 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
102a0 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
102b0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
102c0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
102d0 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  p->pSchema);.  s
102e0 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
102f0 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
10300 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
10310 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
10320 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
10330 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  pSelect) ){.    
10340 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
10350 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
10360 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
10370 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  }..  /* Make a c
10380 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
10390 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
103a0 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
103b0 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
103c0 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
103d0 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
103e0 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
103f0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
10400 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
10410 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
10420 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
10430 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
10440 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
10450 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
10460 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
10470 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
10480 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
10490 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
104a0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
104b0 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50  db, pSelect, EXP
104c0 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
104d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
104e0 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
104f0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
10500 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
10510 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
10520 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
10530 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
10540 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
10550 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
10560 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
10570 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
10580 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
10590 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
105a0 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
105b0 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
105c0 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
105d0 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41  stToken;.  if( A
105e0 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21  LWAYS(sEnd.z[0]!
105f0 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  =0) && sEnd.z[0]
10600 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
10610 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
10620 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
10630 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e  .  n = (int)(sEn
10640 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29  d.z - pBegin->z)
10650 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
10660 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c 57 41  z;.  while( ALWA
10670 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c 69 74  YS(n>0) && sqlit
10680 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
10690 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
106a0 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
106b0 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
106c0 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
106d0 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
106e0 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
106f0 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
10700 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
10710 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
10720 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30  , 0, &sEnd, 0, 0
10730 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
10740 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10750 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
10760 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
10770 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
10780 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10790 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
107a0 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
107b0 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
107c0 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
107d0 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
107e0 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
107f0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
10800 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
10810 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
10820 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10830 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
10840 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
10850 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
10860 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
10870 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
10880 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
10890 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
108a0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
108b0 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
108c0 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
108d0 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
108e0 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
108f0 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
10900 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
10910 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
10920 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
10930 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
10940 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
10950 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
10960 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10970 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
10980 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
10990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
109a0 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
109b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
109c0 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
109d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
109e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
109f0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
10a00 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
10a10 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69  errors */.  sqli
10a20 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b  te3_xauth xAuth;
10a30 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
10a40 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f  xAuth pointer */
10a50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
10a60 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  le );..#ifndef S
10a70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
10a80 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71  ALTABLE.  if( sq
10a90 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e  lite3VtabCallCon
10aa0 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  nect(pParse, pTa
10ab0 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ble) ){.    retu
10ac0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
10ad0 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
10ae0 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
10af0 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
10b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10b10 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
10b20 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
10b30 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
10b40 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
10b50 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
10b60 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
10b70 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
10b80 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
10b90 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
10ba0 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
10bb0 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
10bc0 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
10bd0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
10be0 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
10bf0 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
10c00 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
10c10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
10c20 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
10c30 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
10c40 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
10c50 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
10c60 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
10c70 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
10c80 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
10c90 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
10ca0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
10cb0 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
10cc0 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
10cd0 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
10ce0 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f  y, the error abo
10cf0 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  ve is now caught
10d00 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
10d10 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  ng this point.. 
10d20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c   ** But the foll
10d30 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74  owing test is st
10d40 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73  ill important as
10d50 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70   it does come up
10d60 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  .  ** in the fol
10d70 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20  lowing:.  ** .  
10d80 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
10d90 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b  BLE main.ex1(a);
10da0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
10db0 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41   TEMP VIEW ex1 A
10dc0 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  S SELECT a FROM 
10dd0 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45  ex1;.  **     SE
10de0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70  LECT * FROM temp
10df0 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  .ex1;.  */.  if(
10e00 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
10e10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10e20 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10e30 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
10e40 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
10e50 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
10e60 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
10e70 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
10e80 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
10e90 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
10ea0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
10eb0 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
10ec0 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
10ed0 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
10ee0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
10ef0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
10f00 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
10f10 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
10f20 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
10f30 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
10f40 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
10f50 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
10f60 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
10f70 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
10f80 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
10f90 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
10fa0 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
10fb0 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
10fc0 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
10fd0 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
10fe0 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
10ff0 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
11000 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
11010 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
11020 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
11030 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
11040 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
11050 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
11060 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  pTable->pSelect,
11070 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20   0);.  if( pSel 
11080 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c 65  ){.    u8 enable
11090 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e  Lookaside = db->
110a0 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
110b0 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72  ed;.    n = pPar
110c0 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
110d0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
110e0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
110f0 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
11100 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
11110 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = -1;.    db->lo
11120 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
11130 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
11140 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
11150 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74  IZATION.    xAut
11160 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20  h = db->xAuth;. 
11170 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30     db->xAuth = 0
11180 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  ;.    pSelTab = 
11190 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
111a0 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
111b0 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e   pSel);.    db->
111c0 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23  xAuth = xAuth;.#
111d0 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62  else.    pSelTab
111e0 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
111f0 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
11200 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69  se, pSel);.#endi
11210 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  f.    db->lookas
11220 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 65  ide.bEnabled = e
11230 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a  nableLookaside;.
11240 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
11250 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53   = n;.    if( pS
11260 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61  elTab ){.      a
11270 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
11280 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
11290 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
112a0 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
112b0 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
112c0 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
112d0 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
112e0 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
112f0 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
11300 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
11310 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
11320 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
11330 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11340 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
11350 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70  db, 0, pTable->p
11360 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20  Schema) );.     
11370 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
11380 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d  ->schemaFlags |=
11390 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
113a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
113b0 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
113c0 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
113d0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
113e0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
113f0 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20  (db, pSel);.  } 
11400 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b  else {.    nErr+
11410 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  +;.  }.#endif /*
11420 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11430 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
11440 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
11450 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
11460 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
11470 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11480 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11490 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
114a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
114b0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
114c0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
114d0 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
114e0 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
114f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
11500 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
11510 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
11520 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
11530 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
11540 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
11550 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
11560 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
11570 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
11580 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
11590 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
115a0 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
115b0 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
115c0 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
115d0 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
115e0 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
115f0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
11600 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
11610 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
11620 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
11630 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65      sqliteDelete
11640 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
11650 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61  pTab);.      pTa
11660 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
11670 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20     pTab->nCol = 
11680 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44  0;.    }.  }.  D
11690 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64  bClearProperty(d
116a0 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
116b0 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73  etViews);.}.#els
116c0 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  e.# define sqlit
116d0 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c  eViewResetAll(A,
116e0 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  B).#endif /* SQL
116f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
11700 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11710 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
11720 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61  by the VDBE to a
11730 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e  djust the intern
11740 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65  al schema.** use
11750 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e  d by SQLite when
11760 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
11770 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72   moves a table r
11780 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a  oot page. The.**
11790 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20   root-page of a 
117a0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
117b0 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68  n database iDb h
117c0 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  as changed from 
117d0 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e  iFrom.** to iTo.
117e0 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31  .**.** Ticket #1
117f0 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c  728:  The symbol
11800 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69   table might sti
11810 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72  ll contain infor
11820 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62  mation.** on tab
11830 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63  les and/or indic
11840 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20  es that are the 
11850 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
11860 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20   deleted..** If 
11870 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c  you are unlucky,
11880 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65   one of those de
11890 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72  leted indices or
118a0 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a   tables might.**
118b0 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72   have the same r
118c0 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ootpage number a
118d0 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65  s the real table
118e0 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69   or index that i
118f0 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64  s.** being moved
11900 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
11910 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61  stop searching a
11920 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d  fter the first m
11930 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65  atch .** because
11940 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
11950 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e   might be for on
11960 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64  e of the deleted
11970 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74   indices.** or t
11980 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68  ables and not th
11990 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68  e table/index th
119a0 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62  at is actually b
119b0 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57  eing moved..** W
119c0 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20  e must continue 
119d0 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c  looping until al
119e0 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64  l tables and ind
119f0 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f  ices with.** roo
11a00 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76  tpage==iFrom hav
11a10 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  e been converted
11a20 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70   to have a rootp
11a30 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e  age of iTo.** in
11a40 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72   order to be cer
11a50 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74  tain that we got
11a60 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a   the right one..
11a70 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11a80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
11a90 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  M.void sqlite3Ro
11aa0 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69  otPageMoved(sqli
11ab0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
11ac0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
11ad0 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65   iTo){.  HashEle
11ae0 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68  m *pElem;.  Hash
11af0 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70   *pHash;.  Db *p
11b00 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Db;..  assert( s
11b10 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
11b20 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
11b30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62  ) );.  pDb = &db
11b40 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48  ->aDb[iDb];.  pH
11b50 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
11b60 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20  ema->tblHash;.  
11b70 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
11b80 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
11b90 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
11ba0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
11bb0 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  lem)){.    Table
11bc0 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
11bd0 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
11be0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e      if( pTab->tn
11bf0 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
11c00 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20     pTab->tnum = 
11c10 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  iTo;.    }.  }. 
11c20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
11c30 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
11c40 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
11c50 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
11c60 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
11c70 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
11c80 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e  (pElem)){.    In
11c90 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69  dex *pIdx = sqli
11ca0 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
11cb0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  );.    if( pIdx-
11cc0 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
11cd0 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d        pIdx->tnum
11ce0 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
11cf0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
11d00 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20  * Write code to 
11d10 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20  erase the table 
11d20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
11d30 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62  Table from datab
11d40 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f  ase iDb..** Also
11d50 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d   write code to m
11d60 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
11d70 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
11d80 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  d internal schem
11d90 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70  a.** if a root-p
11da0 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74  age of another t
11db0 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
11dc0 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72   the btree-layer
11dd0 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69   whilst.** erasi
11de0 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20  ng iTable (this 
11df0 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
11e00 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
11e10 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74  atabase)..*/ .st
11e20 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
11e30 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20  yRootPage(Parse 
11e40 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61  *pParse, int iTa
11e50 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  ble, int iDb){. 
11e60 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
11e70 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
11e80 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71  );.  int r1 = sq
11e90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
11ea0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
11eb0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11ec0 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62  OP_Destroy, iTab
11ed0 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20  le, r1, iDb);.  
11ee0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
11ef0 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
11f00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11f10 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
11f20 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
11f30 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
11f40 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
11f50 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
11f60 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
11f70 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
11f80 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
11f90 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
11fa0 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
11fb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
11fc0 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
11fd0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
11fe0 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
11ff0 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
12000 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
12010 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
12020 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
12030 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
12040 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
12050 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
12060 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c   See grammar rul
12070 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
12080 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54  th the TK_REGIST
12090 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f  ER.  ** token fo
120a0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
120b0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ormation..  */. 
120c0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
120d0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
120e0 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
120f0 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
12100 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
12110 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
12120 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
12130 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
12140 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
12150 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29   iTable, r1, r1)
12160 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
12170 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12180 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
12190 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
121a0 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
121b0 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
121c0 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
121d0 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
121e0 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
121f0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
12200 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
12210 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
12220 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
12230 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
12240 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
12250 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
12260 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
12270 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
12280 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
12290 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
122a0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
122b0 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
122c0 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
122d0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
122e0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
122f0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12300 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12310 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
12320 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
12330 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
12340 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
12350 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65  ->pSchema);.  de
12360 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
12370 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
12380 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  , iDb);.  for(pI
12390 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
123a0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
123b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
123c0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
123d0 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
123e0 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  , iDb);.  }.#els
123f0 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
12400 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
12410 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
12420 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
12430 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
12440 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
12450 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
12460 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
12470 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
12480 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
12490 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
124a0 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
124b0 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
124c0 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
124d0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
124e0 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
124f0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
12500 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
12510 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
12520 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
12530 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
12540 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
12550 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
12560 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
12570 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
12580 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
12590 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
125a0 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
125b0 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
125c0 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
125d0 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
125e0 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
125f0 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
12600 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
12610 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
12620 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
12630 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
12640 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
12650 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
12660 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
12670 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
12680 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
12690 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
126a0 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
126b0 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
126c0 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
126d0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
126e0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
126f0 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
12700 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
12710 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
12720 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
12730 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
12740 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
12750 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
12760 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
12770 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
12780 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
12790 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
127a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
127b0 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
127c0 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
127d0 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
127e0 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
127f0 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
12800 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
12810 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
12820 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
12830 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
12840 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a   iLargest==0 ){.
12850 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
12860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
12870 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
12880 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
12890 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
128a0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
128b0 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
128c0 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62  & iDb<pParse->db
128d0 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64  ->nDb );.      d
128e0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
128f0 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c  Parse, iLargest,
12900 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65   iDb);.      iDe
12910 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65  stroyed = iLarge
12920 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  st;.    }.  }.#e
12930 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
12940 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
12950 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61  m the sqlite_sta
12960 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e  tN tables (for N
12970 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20   in (1,2,3)).** 
12980 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44  after a DROP IND
12990 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45  EX or DROP TABLE
129a0 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61   command..*/.sta
129b0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
129c0 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
129d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
129e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
129f0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
12a00 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20   */.  int iDb,  
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12a20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d  The database num
12a30 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ber */.  const c
12a40 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20  har *zType,     
12a50 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c  /* "idx" or "tbl
12a60 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  " */.  const cha
12a70 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a  r *zName      /*
12a80 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f   Name of index o
12a90 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  r table */.){.  
12aa0 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
12ab0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70  har *zDbName = p
12ac0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
12ad0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72  Db].zName;.  for
12ae0 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29  (i=1; i<=4; i++)
12af0 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b  {.    char zTab[
12b00 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  24];.    sqlite3
12b10 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
12b20 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c  (zTab),zTab,"sql
12b30 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a  ite_stat%d",i);.
12b40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
12b50 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
12b60 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61  >db, zTab, zDbNa
12b70 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
12b80 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
12b90 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
12ba0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
12bb0 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c  %s WHERE %s=%Q",
12bc0 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65  .        zDbName
12bd0 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a  , zTab, zType, z
12be0 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
12bf0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12c00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12c10 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a  o drop a table..
12c20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
12c30 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72  odeDropTable(Par
12c40 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
12c50 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62  e *pTab, int iDb
12c60 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20  , int isView){. 
12c70 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
12c80 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12c90 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20  ->db;.  Trigger 
12ca0 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20  *pTrigger;.  Db 
12cb0 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
12cc0 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  iDb];..  v = sql
12cd0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
12ce0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
12cf0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
12d00 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
12d10 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
12d20 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
12d30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12d40 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
12d50 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
12d60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12d70 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
12d80 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  in);.  }.#endif.
12d90 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74  .  /* Drop all t
12da0 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
12db0 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
12dc0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
12dd0 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65   Code.  ** is ge
12de0 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
12df0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
12e00 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
12e10 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  /or.  ** sqlite_
12e20 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72  temp_master if r
12e30 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
12e40 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74  pTrigger = sqlit
12e50 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50  e3TriggerList(pP
12e60 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77  arse, pTab);.  w
12e70 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
12e80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
12e90 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
12ea0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c  =pTab->pSchema |
12eb0 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67  | .        pTrig
12ec0 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  ger->pSchema==db
12ed0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
12ee0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
12ef0 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
12f00 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
12f10 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20  .    pTrigger = 
12f20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
12f30 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
12f40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
12f50 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  CREMENT.  /* Rem
12f60 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ove any entries 
12f70 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  of the sqlite_se
12f80 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73  quence table ass
12f90 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a  ociated with.  *
12fa0 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * the table bein
12fb0 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20  g dropped. This 
12fc0 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74  is done before t
12fd0 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70  he table is drop
12fe0 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20  ped.  ** at the 
12ff0 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
13000 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
13010 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
13020 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76  eeds to.  ** mov
13030 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
13040 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68   the drop (can h
13050 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
13060 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f  cuum mode)..  */
13070 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
13080 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
13090 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
130a0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
130b0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
130c0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
130d0 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
130e0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
130f0 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
13100 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
13110 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66     );.  }.#endif
13120 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
13130 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
13140 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  ble and index en
13150 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
13160 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   to the.  ** tab
13170 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20  le. The program 
13180 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75  name loops throu
13190 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  gh the master ta
131a0 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a  ble and deletes.
131b0 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
131c0 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
131d0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
131e0 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
131f0 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f  e being.  ** dro
13200 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61  pped. Triggers a
13210 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
13220 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20  ately because a 
13230 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20  trigger can be. 
13240 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
13250 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
13260 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
13270 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
13280 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  er.  ** database
13290 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
132a0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
132b0 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45  se, .      "DELE
132c0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
132d0 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20  ERE tbl_name=%Q 
132e0 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67  and type!='trigg
132f0 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d  er'",.      pDb-
13300 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  >zName, SCHEMA_T
13310 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d  ABLE(iDb), pTab-
13320 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  >zName);.  if( !
13330 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72  isView && !IsVir
13340 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
13350 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70    destroyTable(p
13360 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
13370 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
13380 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
13390 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
133a0 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
133b0 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65   modify.  ** the
133c0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
133d0 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72    */.  if( IsVir
133e0 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
133f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13400 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72  Op4(v, OP_VDestr
13410 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  oy, iDb, 0, 0, p
13420 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Tab->zName, 0);.
13430 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
13440 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
13450 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
13460 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
13470 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68   0);.  sqlite3Ch
13480 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
13490 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  e, iDb);.  sqlit
134a0 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
134b0 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , iDb);.}../*.**
134c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
134d0 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
134e0 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
134f0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
13500 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
13510 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
13520 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
13530 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
13540 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
13550 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
13560 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
13570 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
13580 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
13590 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
135a0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
135b0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
135c0 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Db;..  if( db->m
135d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
135e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
135f0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
13600 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
13610 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Err==0 );.  asse
13620 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
13630 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72  =1 );.  if( noEr
13640 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
13650 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20  Err++;.  pTab = 
13660 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
13670 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69  leItem(pParse, i
13680 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61  sView, &pName->a
13690 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72  [0]);.  if( noEr
136a0 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
136b0 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54  Err--;..  if( pT
136c0 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ab==0 ){.    if(
136d0 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33   noErr ) sqlite3
136e0 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
136f0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
13700 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
13710 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ase);.    goto e
13720 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13730 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
13740 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
13750 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
13760 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
13770 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
13780 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nDb );..  /* If
13790 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
137a0 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
137b0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
137c0 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
137d0 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
137e0 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
137f0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
13800 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
13810 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
13820 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
13830 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13840 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
13850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13860 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
13870 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
13880 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13890 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
138a0 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
138b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
138c0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
138d0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
138e0 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a  har *zArg2 = 0;.
138f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
13900 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
13910 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
13920 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a  zTab, 0, zDb)){.
13930 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13940 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
13950 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  }.    if( isView
13960 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f   ){.      if( !O
13970 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
13980 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
13990 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
139a0 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  OP_TEMP_VIEW;.  
139b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
139c0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
139d0 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20  _DROP_VIEW;.    
139e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
139f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
13a00 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
13a10 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
13a20 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65  b) ){.      code
13a30 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
13a40 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72  TABLE;.      zAr
13a50 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  g2 = sqlite3GetV
13a60 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d  Table(db, pTab)-
13a70 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65  >pMod->zName;.#e
13a80 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
13a90 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
13aa0 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
13ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
13ac0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
13ad0 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
13ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13af0 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
13b00 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  OP_TABLE;.      
13b10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13b20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
13b30 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70  (pParse, code, p
13b40 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67  Tab->zName, zArg
13b50 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  2, zDb) ){.     
13b60 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
13b70 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20  table;.    }.   
13b80 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13b90 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13ba0 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61  LITE_DELETE, pTa
13bb0 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  b->zName, 0, zDb
13bc0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13bd0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
13be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13bf0 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  f.  if( sqlite3S
13c00 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
13c10 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
13c20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71  7)==0 .    && sq
13c30 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
13c40 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
13c50 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30  te_stat", 11)!=0
13c60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
13c70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13c80 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
13c90 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70  t be dropped", p
13ca0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
13cb0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
13cc0 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e  table;.  }..#ifn
13cd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13ce0 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65  VIEW.  /* Ensure
13cf0 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e   DROP TABLE is n
13d00 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65  ot used on a vie
13d10 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57  w, and DROP VIEW
13d20 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a   is not used.  *
13d30 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20  * on a table..  
13d40 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20  */.  if( isView 
13d50 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
13d60 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
13d70 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13d80 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42  e, "use DROP TAB
13d90 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62  LE to delete tab
13da0 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  le %s", pTab->zN
13db0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
13dc0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13dd0 20 20 7d 0a 20 20 69 66 28 20 21 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 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
13e00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13e10 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57  , "use DROP VIEW
13e20 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20   to delete view 
13e30 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
13e40 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
13e50 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
13e60 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
13e70 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
13e80 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
13e90 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
13ea0 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69  table.  ** on di
13eb0 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  sk..  */.  v = s
13ec0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13ed0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
13ee0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
13ef0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
13f00 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
13f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
13f20 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
13f30 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c  rse, iDb, "tbl",
13f40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13f50 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70     sqlite3FkDrop
13f60 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e  Table(pParse, pN
13f70 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  ame, pTab);.    
13f80 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54  sqlite3CodeDropT
13f90 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
13fa0 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b  b, iDb, isView);
13fb0 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
13fc0 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
13fd0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
13fe0 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
13ff0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14000 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
14010 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
14020 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
14030 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
14040 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
14050 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
14060 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
14070 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
14080 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
14090 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
140a0 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
140b0 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
140c0 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
140d0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
140e0 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
140f0 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
14100 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
14110 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e  eferred to (a.k.
14120 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74  a the "parent" t
14130 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69  able).  pToCol i
14140 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74  s a list.** of t
14150 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72  ables in the par
14160 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20  ent pTo table.  
14170 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
14180 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
14190 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
141a0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
141b0 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
141c0 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
141d0 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
141e0 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
141f0 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
14200 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
14210 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
14220 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
14230 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
14240 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
14250 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
14260 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
14270 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  eld..**.** The f
14280 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
14290 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
142a0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
142b0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
142c0 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
142d0 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
142e0 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
142f0 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
14300 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
14310 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
14320 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
14330 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
14340 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
14350 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
14360 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
14370 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
14380 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
14390 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
143a0 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
143b0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
143c0 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
143d0 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
143e0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
143f0 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
14400 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
14410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14420 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
14430 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
14440 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
14450 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14460 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14470 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
14480 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
14490 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78   0;.  FKey *pNex
144a0 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20  tTo;.  Table *p 
144b0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
144c0 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
144d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
144e0 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
144f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
14500 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
14510 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
14520 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65  VTAB ) goto fk_e
14530 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
14540 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
14550 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
14560 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  1;.    if( NEVER
14570 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20  (iCol<0) ) goto 
14580 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
14590 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
145a0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
145b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
145c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
145d0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
145e0 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
145f0 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
14600 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
14610 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
14620 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
14630 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
14640 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
14650 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
14660 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
14670 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
14680 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
14690 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
146a0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
146b0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
146c0 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
146d0 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
146e0 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
146f0 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
14700 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
14710 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
14720 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
14730 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
14740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
14750 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
14760 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
14770 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
14780 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
14790 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
147a0 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
147b0 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
147c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
147d0 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
147e0 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
147f0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
14800 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
14810 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
14820 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
14830 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
14840 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29  Zero(db, nByte )
14850 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
14860 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f   ){.    goto fk_
14870 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79  end;.  }.  pFKey
14880 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
14890 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
148a0 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
148b0 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d  = (char*)&pFKey-
148c0 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70  >aCol[nCol];.  p
148d0 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
148e0 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
148f0 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
14900 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  pTo->n] = 0;.  s
14910 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
14920 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
14930 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  1;.  pFKey->nCol
14940 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
14950 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
14960 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
14970 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
14980 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
14990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
149a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
149b0 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
149c0 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
149d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
149e0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
149f0 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
14a00 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
14a10 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
14a20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
14a30 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
14a40 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
14a50 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
14a60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
14a70 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
14a80 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14a90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
14aa0 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
14ab0 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
14ac0 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
14ad0 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
14ae0 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
14af0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
14b00 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
14b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14b20 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c    }.  if( pToCol
14b30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
14b40 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
14b50 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
14b60 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
14b70 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
14b80 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61  ;.      pFKey->a
14b90 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b  Col[i].zCol = z;
14ba0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
14bb0 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
14bc0 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
14bd0 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
14be0 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
14bf0 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
14c00 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
14c10 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20  Key->aAction[0] 
14c20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30  = (u8)(flags & 0
14c30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20  xff);           
14c40 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63   /* ON DELETE ac
14c50 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  tion */.  pFKey-
14c60 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75  >aAction[1] = (u
14c70 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29  8)((flags >> 8 )
14c80 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20   & 0xff);    /* 
14c90 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e  ON UPDATE action
14ca0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
14cb0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
14cc0 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e  xHeld(db, 0, p->
14cd0 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e  pSchema) );.  pN
14ce0 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29  extTo = (FKey *)
14cf0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
14d00 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  t(&p->pSchema->f
14d10 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20  keyHash, .      
14d20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69  pFKey->zTo, (voi
14d30 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20  d *)pFKey.  );. 
14d40 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46   if( pNextTo==pF
14d50 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  Key ){.    db->m
14d60 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
14d70 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
14d80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78  ;.  }.  if( pNex
14d90 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tTo ){.    asser
14da0 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65  t( pNextTo->pPre
14db0 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  vTo==0 );.    pF
14dc0 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  Key->pNextTo = p
14dd0 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78  NextTo;.    pNex
14de0 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70  tTo->pPrevTo = p
14df0 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  FKey;.  }..  /* 
14e00 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
14e10 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
14e20 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
14e30 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
14e40 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
14e50 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
14e60 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  d:.  sqlite3DbFr
14e70 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23  ee(db, pFKey);.#
14e80 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
14e90 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
14ea0 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
14eb0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
14ec0 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43  elete(db, pFromC
14ed0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
14ee0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
14ef0 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a   pToCol);.}../*.
14f00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14f10 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
14f20 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
14f30 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
14f40 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
14f50 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
14f60 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
14f70 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
14f80 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
14f90 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
14fa0 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
14fb0 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
14fc0 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
14fd0 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
14fe0 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
14ff0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
15000 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
15010 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
15020 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
15030 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
15040 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
15050 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
15060 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
15070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15080 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
15090 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
150a0 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
150b0 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
150c0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
150d0 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
150e0 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
150f0 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
15100 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c   isDeferred==0 |
15110 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20  | isDeferred==1 
15120 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32  ); /* EV: R-3032
15130 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b  3-21917 */.  pFK
15140 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
15150 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b   (u8)isDeferred;
15160 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
15170 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15180 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
15190 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
151a0 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
151b0 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
151c0 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
151d0 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
151e0 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
151f0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
15200 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
15210 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
15220 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
15230 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
15240 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
15250 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
15260 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
15270 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
15280 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66   register specif
15290 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
152a0 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
152b0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
152c0 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
152d0 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
152e0 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
152f0 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
15300 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
15310 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
15320 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
15330 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
15340 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the 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 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
15370 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
15380 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
15390 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
153a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
153b0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
153c0 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
153d0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
153e0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
153f0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
15400 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
15410 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
15420 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
15430 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
15440 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
15450 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
15460 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
15470 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
15480 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
15490 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53  ndex */.  int iS
154a0 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  orter;          
154b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
154c0 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65  or opened by Ope
154d0 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75  nSorter (if in u
154e0 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  se) */.  int add
154f0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
15500 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
15510 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
15520 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32  p */.  int addr2
15530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15540 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15550 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20   to jump to for 
15560 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a  next iteration *
15570 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15590 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
155a0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
155b0 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b  t iPartIdxLabel;
155c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
155d0 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62  Jump to this lab
155e0 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77  el to skip a row
155f0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
15600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15610 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
15620 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
15630 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
15640 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
15650 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
15660 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66      /* KeyInfo f
15670 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  or index */.  in
15680 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156a0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
156b0 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78   assembled index
156c0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
156d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
156e0 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54  e->db;      /* T
156f0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
15700 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
15710 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
15720 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
15730 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
15740 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15750 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
15760 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
15770 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15780 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
15790 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
157a0 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  , 0,.      db->a
157b0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  Db[iDb].zName ) 
157c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
157d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
157e0 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
157f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
15800 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
15810 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
15820 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
15830 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
15840 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
15850 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
15860 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15870 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15880 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
15890 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
158a0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d  e>=0 ){.    tnum
158b0 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a   = memRootPage;.
158c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
158d0 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
158e0 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73  ;.  }.  pKey = s
158f0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
15900 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
15910 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  dex);..  /* Open
15920 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
15930 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20  or if we are to 
15940 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53  use one. */.  iS
15950 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  orter = pParse->
15960 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
15970 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
15980 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53  P_SorterOpen, iS
15990 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78  orter, 0, pIndex
159a0 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72  ->nKeyCol, (char
159b0 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *).             
159c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
159d0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20  yInfoRef(pKey), 
159e0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
159f0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c  /* Open the tabl
15a00 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  e. Loop through 
15a10 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
15a20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67  table, inserting
15a30 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f   index.  ** reco
15a40 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  rds into the sor
15a50 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ter. */.  sqlite
15a60 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
15a70 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
15a80 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
15a90 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
15aa0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15ab0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
15ac0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
15ad0 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f  ge(v);.  regReco
15ae0 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
15af0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
15b00 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
15b10 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
15b20 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65  e,pIndex,iTab,re
15b30 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74  gRecord,0,&iPart
15b40 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20  IdxLabel,0,0);. 
15b50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15b60 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
15b70 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
15b80 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
15b90 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
15ba0 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c  IdxLabel(pParse,
15bb0 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b   iPartIdxLabel);
15bc0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15bd0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
15be0 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
15bf0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
15c00 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
15c10 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
15c20 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
15c30 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33  Page<0 ) sqlite3
15c40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15c50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
15c60 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
15c70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
15c80 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
15c90 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
15cb0 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
15cc0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
15cd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
15ce0 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
15cf0 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  R|((memRootPage>
15d00 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52  =0)?OPFLAG_P2ISR
15d10 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31  EG:0));..  addr1
15d20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15d30 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
15d40 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
15d50 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
15d60 28 76 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (v);.  assert( p
15d70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  Key!=0 || db->ma
15d80 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
15d90 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20  arse->nErr );.  
15da0 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  if( IsUniqueInde
15db0 78 28 70 49 6e 64 65 78 29 20 26 26 20 70 4b 65  x(pIndex) && pKe
15dc0 79 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  y!=0 ){.    int 
15dd0 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
15de0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
15df0 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   3;.    sqlite3V
15e00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15e10 47 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20  Goto, 0, j2);.  
15e20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
15e30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15e40 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
15e50 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
15e60 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72   OP_SorterCompar
15e70 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20  e, iSorter, j2, 
15e80 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20  regRecord,.     
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ea0 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79      pIndex->nKey
15eb0 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Col); VdbeCovera
15ec0 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
15ed0 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69  e3UniqueConstrai
15ee0 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62  nt(pParse, OE_Ab
15ef0 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  ort, pIndex);.  
15f00 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32  }else{.    addr2
15f10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15f20 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
15f30 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
15f40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
15f50 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c  erData, iSorter,
15f60 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
15f70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15f80 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
15f90 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72  , iIdx, regRecor
15fa0 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  d, 1);.  sqlite3
15fb0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
15fc0 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
15fd0 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
15fe0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
15ff0 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
16000 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16010 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
16020 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72  terNext, iSorter
16030 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f  , addr2); VdbeCo
16040 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
16050 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
16060 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73  (v, addr1);..  s
16070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16080 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
16090 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
160a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
160b0 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73  lose, iIdx);.  s
160c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
160d0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53  (v, OP_Close, iS
160e0 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  orter);.}../*.**
160f0 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73   Allocate heap s
16100 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20  pace to hold an 
16110 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74  Index object wit
16120 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a  h nCol columns..
16130 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74  **.** Increase t
16140 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  he allocation si
16150 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  ze to provide an
16160 20 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79   extra nExtra by
16170 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65  tes.** of 8-byte
16180 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61   aligned space a
16190 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
161a0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
161b0 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f   a.** pointer to
161c0 20 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63   this extra spac
161d0 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a  e in *ppExtra..*
161e0 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
161f0 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
16200 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
16210 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44  db,         /* D
16220 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16230 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c  on */.  i16 nCol
16240 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16250 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
16260 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
16270 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ndex */.  int nE
16280 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f  xtra,          /
16290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
162a0 73 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65  s of extra space
162b0 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63   to alloc */.  c
162c0 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20  har **ppExtra   
162d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
162e0 6f 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70  o the "extra" sp
162f0 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ace */.){.  Inde
16300 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
16310 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e   /* Allocated in
16320 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
16330 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
16340 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
16350 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78   space for Index
16360 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73   object + arrays
16370 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52   */..  nByte = R
16380 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64  OUND8(sizeof(Ind
16390 65 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  ex)) +          
163a0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
163b0 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20  ucture  */.     
163c0 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
163d0 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20  of(char*)*nCol) 
163e0 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  +         /* Ind
163f0 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f  ex.azColl     */
16400 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
16410 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  8(sizeof(LogEst)
16420 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20  *(nCol+1) +     
16430 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f  /* Index.aiRowLo
16440 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20  gEst   */.      
16450 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
16460 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20  f(i16)*nCol +   
16470 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
16480 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a  x.aiColumn   */.
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164a0 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c   sizeof(u8)*nCol
164b0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
164c0 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64  * Index.aSortOrd
164d0 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  er */.  p = sqli
164e0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
164f0 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74  db, nByte + nExt
16500 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ra);.  if( p ){.
16510 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61      char *pExtra
16520 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f   = ((char*)p)+RO
16530 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
16540 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  x));.    p->azCo
16550 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 70 45 78  ll = (char**)pEx
16560 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72  tra;       pExtr
16570 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  a += ROUND8(size
16580 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b  of(char*)*nCol);
16590 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67  .    p->aiRowLog
165a0 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70  Est = (LogEst*)p
165b0 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d  Extra; pExtra +=
165c0 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a   sizeof(LogEst)*
165d0 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d  (nCol+1);.    p-
165e0 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
165f0 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20  *)pExtra;       
16600 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
16610 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20  (i16)*nCol;.    
16620 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
16630 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20  (u8*)pExtra;.   
16640 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43   p->nColumn = nC
16650 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43  ol;.    p->nKeyC
16660 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20  ol = nCol - 1;. 
16670 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28     *ppExtra = ((
16680 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65  char*)p) + nByte
16690 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
166a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
166b0 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
166c0 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
166d0 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
166e0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
166f0 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
16700 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
16710 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
16720 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
16730 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
16740 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
16750 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
16760 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
16770 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
16780 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
16790 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
167a0 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
167b0 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
167c0 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
167d0 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
167e0 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
167f0 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
16800 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
16810 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
16820 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
16830 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
16840 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
16850 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
16860 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
16870 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
16880 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
16890 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
168a0 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
168b0 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
168c0 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
168d0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
168e0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
168f0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
16900 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
16910 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a  struction.  .**.
16920 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  ** If the index 
16930 69 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65  is created succe
16940 73 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20  ssfully, return 
16950 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
16960 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74   new Index.** st
16970 72 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73  ructure. This is
16980 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
16990 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20  AddPrimaryKey() 
169a0 74 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65  to mark the inde
169b0 78 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  x.** as the tabl
169c0 65 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28  es primary key (
169d0 49 6e 64 65 78 2e 69 64 78 54 79 70 65 3d 3d 53  Index.idxType==S
169e0 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
169f0 49 4d 41 52 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64  IMARYKEY).*/.Ind
16a00 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  ex *sqlite3Creat
16a10 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
16a20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
16a30 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  All information 
16a40 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65  about this parse
16a50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
16a60 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73  me1,     /* Firs
16a70 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  t part of index 
16a80 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
16a90 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
16aa0 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63  ame2,     /* Sec
16ab0 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65  ond part of inde
16ac0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
16ad0 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ULL */.  SrcList
16ae0 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54   *pTblName, /* T
16af0 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55  able to index. U
16b00 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  se pParse->pNewT
16b10 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45  able if 0 */.  E
16b20 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
16b30 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63    /* A list of c
16b40 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64  olumns to be ind
16b50 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
16b60 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
16b70 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e  OE_Abort, OE_Ign
16b80 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c  ore, OE_Replace,
16b90 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20   or OE_None */. 
16ba0 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20   Token *pStart, 
16bb0 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
16bc0 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
16bd0 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65  ins this stateme
16be0 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50  nt */.  Expr *pP
16bf0 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48  IWhere,    /* WH
16c00 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70  ERE clause for p
16c10 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a  artial indices *
16c20 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
16c30 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f  r,     /* Sort o
16c40 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20  rder of primary 
16c50 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d  key when pList==
16c60 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66  NULL */.  int if
16c70 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20  NotExist     /* 
16c80 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e  Omit error if in
16c90 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
16ca0 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ts */.){.  Index
16cb0 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
16cc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65  /* Pointer to re
16cd0 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  turn */.  Table 
16ce0 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
16cf0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
16d00 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
16d10 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
16d20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
16d30 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
16d40 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
16d50 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16d60 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
16d70 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
16d80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16d90 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
16da0 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
16db0 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
16dc0 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
16dd0 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
16de0 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
16df0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
16e00 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
16e10 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
16e20 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
16e30 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
16e40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
16e50 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
16e60 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
16e70 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
16e80 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
16e90 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
16ea0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
16eb0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
16ec0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
16ed0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
16ee0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
16ef0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
16f00 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
16f10 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
16f20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
16f30 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
16f40 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
16f50 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
16f60 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
16f70 69 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 43  ist */.  const C
16f80 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 20  olumn *pTabCol; 
16f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
16fa0 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62  olumn in the tab
16fb0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  le */.  int nExt
16fc0 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
16fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
16fe0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
16ff0 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e  zExtra[] */.  in
17000 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20  t nExtraCol;    
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17020 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
17030 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64  a columns needed
17040 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74   */.  char *zExt
17050 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ra = 0;         
17060 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
17070 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20  space after the 
17080 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
17090 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
170a0 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52  ;      /* PRIMAR
170b0 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20  Y KEY index for 
170c0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
170d0 62 6c 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  bles */..  asser
170e0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
170f0 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65  =0 );      /* Ne
17100 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
17110 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  prior errors */.
17120 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
17130 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43  Failed || IN_DEC
17140 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20  LARE_VTAB ){.   
17150 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17160 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  e_index;.  }.  i
17170 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
17180 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
17190 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
171a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
171b0 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
171c0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
171d0 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
171e0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
171f0 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
17200 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
17210 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
17220 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
17230 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
17240 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
17250 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
17260 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
17270 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
17280 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
17290 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
172a0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
172b0 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
172c0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
172d0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
172e0 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
172f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
17300 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
17310 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
17320 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
17330 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
17340 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
17360 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20  ame && pName->z 
17370 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
17380 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20  TE_OMIT_TEMPDB. 
17390 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64     /* If the ind
173a0 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75  ex name was unqu
173b0 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69  alified, check i
173c0 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  f the table.    
173d0 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62  ** is a temp tab
173e0 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74  le. If so, set t
173f0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31  he database to 1
17400 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  . Do not do this
17410 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69  .    ** if initi
17420 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61  alising a databa
17430 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a  se schema..    *
17440 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  /.    if( !db->i
17450 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
17460 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
17470 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50  SrcListLookup(pP
17480 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  arse, pTblName);
17490 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
174a0 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20  2->n==0 && pTab 
174b0 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
174c0 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
174d0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
174e0 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  iDb = 1;.      }
174f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
17500 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69     sqlite3FixIni
17510 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
17520 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
17530 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73  Name);.    if( s
17540 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
17550 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65  (&sFix, pTblName
17560 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65  ) ){.      /* Be
17570 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
17580 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
17590 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
175a0 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
175b0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
175c0 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
175d0 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
175e0 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
175f0 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
17600 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
17610 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
17620 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d   &pTblName->a[0]
17630 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
17640 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
17650 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b  =0 || pTab==0 );
17660 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
17670 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
17680 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
17690 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d  f( iDb==1 && db-
176a0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
176b0 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a!=pTab->pSchema
176c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
176d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
176e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63  , .           "c
176f0 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54  annot create a T
17700 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e  EMP index on non
17710 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73  -TEMP table \"%s
17720 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
17730 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
17740 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
17750 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
17760 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f  }.    if( !HasRo
17770 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20  wid(pTab) ) pPk 
17780 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
17790 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
177a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
177b0 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b  ert( pName==0 );
177c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
177d0 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  art==0 );.    pT
177e0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
177f0 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
17800 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
17810 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17820 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
17830 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
17840 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
17850 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
17860 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
17870 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
17880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17890 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
178a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
178b0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
178c0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
178d0 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
178e0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
178f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
17900 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
17910 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
17920 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70  3UserAuthTable(p
17930 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23  Tab->zName)==0.#
17940 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26 20  endif.       && 
17950 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
17960 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c  &pTab->zName[7],
17970 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d  "altertab_",9)!=
17980 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
17990 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
179a0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
179b0 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
179c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
179d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
179e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
179f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17a00 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
17a10 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
17a20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17a30 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
17a40 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
17a50 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
17a60 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17a70 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  x;.  }.#endif.#i
17a80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17a90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
17aa0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
17ab0 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
17ac0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17ad0 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62  se, "virtual tab
17ae0 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  les may not be i
17af0 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
17b00 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17b10 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
17b20 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
17b30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
17b40 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
17b50 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
17b60 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
17b70 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
17b80 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
17b90 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
17ba0 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
17bb0 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
17bc0 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
17bd0 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
17be0 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
17bf0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
17c00 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
17c10 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
17c20 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
17c30 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
17c40 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
17c50 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
17c60 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
17c70 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
17c80 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
17c90 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
17ca0 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
17cb0 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
17cc0 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
17cd0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
17ce0 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
17cf0 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
17d00 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
17d10 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
17d20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
17d30 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
17d40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
17d50 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
17d60 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
17d70 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
17d80 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
17d90 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
17da0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17db0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
17dc0 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  >z!=0 );.    if(
17dd0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
17de0 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
17df0 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
17e00 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17e10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17e20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
17e30 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
17e40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
17e50 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
17e60 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29  , zName, 0)!=0 )
17e70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
17e80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17e90 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
17ea0 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65  ady a table name
17eb0 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
17ec0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
17ed0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17ef0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
17f00 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
17f10 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20   pDb->zName)!=0 
17f20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66  ){.      if( !if
17f30 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20  NotExist ){.    
17f40 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17f50 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
17f60 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
17f70 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
17f80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17f90 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
17fa0 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
17fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
17fc0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
17fd0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
17fe0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
17ff0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18000 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
18010 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
18020 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
18030 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
18040 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
18050 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
18060 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
18070 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
18080 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
18090 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
180a0 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e  x_%s_%d", pTab->
180b0 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69  zName, n);.    i
180c0 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
180d0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
180e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
180f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
18100 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
18110 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
18120 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
18130 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18140 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
18150 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
18160 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a  ar *zDb = pDb->z
18170 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
18180 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
18190 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
181a0 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
181b0 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
181c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
181d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
181e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
181f0 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
18200 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
18210 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
18220 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
18230 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
18240 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
18250 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
18260 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
18270 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
18280 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
18290 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
182a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
182b0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
182c0 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
182d0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
182e0 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
182f0 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
18300 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
18310 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
18320 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
18330 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
18340 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
18350 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
18360 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
18370 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
18380 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
18390 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
183a0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
183b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69   0);.    if( pLi
183c0 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
183d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
183e0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
183f0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
18400 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e  bStrDup(pParse->
18410 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18430 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
18440 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f  ->aCol[pTab->nCo
18450 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l-1].zName);.   
18460 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
18470 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72  tOrder = (u8)sor
18480 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  tOrder;.  }..  /
18490 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
184a0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73   many bytes of s
184b0 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65  pace are require
184c0 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69  d to store expli
184d0 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69  citly.  ** speci
184e0 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  fied collation s
184f0 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20  equence names.. 
18500 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
18510 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
18520 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
18530 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
18540 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
18550 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ( pExpr ){.     
18560 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
18570 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
18580 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  ;.      nExtra +
18590 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
185a0 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
185b0 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  zToken));.    }.
185c0 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
185d0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
185e0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
185f0 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
18600 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
18610 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f  ame);.  nExtraCo
18620 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e  l = pPk ? pPk->n
18630 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49  KeyCol : 1;.  pI
18640 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c  ndex = sqlite3Al
18650 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63  locateIndexObjec
18660 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t(db, pList->nEx
18670 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a  pr + nExtraCol,.
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45        nName + nE
186b0 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72  xtra + 1, &zExtr
186c0 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  a);.  if( db->ma
186d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
186e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
186f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
18700 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
18710 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e  TE_ALIGNMENT(pIn
18720 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  dex->aiRowLogEst
18730 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ) );.  assert( E
18740 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
18750 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  ENT(pIndex->azCo
18760 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d  ll) );.  pIndex-
18770 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b  >zName = zExtra;
18780 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61  .  zExtra += nNa
18790 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79  me + 1;.  memcpy
187a0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
187b0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
187c0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
187d0 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
187e0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75  ex->onError = (u
187f0 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  8)onError;.  pIn
18800 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
18810 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e   = onError!=OE_N
18820 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69  one;.  pIndex->i
18830 64 78 54 79 70 65 20 3d 20 70 4e 61 6d 65 20 3f  dxType = pName ?
18840 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
18850 41 50 50 44 45 46 20 3a 20 53 51 4c 49 54 45 5f  APPDEF : SQLITE_
18860 49 44 58 54 59 50 45 5f 55 4e 49 51 55 45 3b 0a  IDXTYPE_UNIQUE;.
18870 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
18880 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
18890 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64  .pSchema;.  pInd
188a0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c  ex->nKeyCol = pL
188b0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
188c0 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20  ( pPIWhere ){.  
188d0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
188e0 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
188f0 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50  arse, pTab, NC_P
18900 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65  artIdx, pPIWhere
18910 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78  , 0);.    pIndex
18920 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20  ->pPartIdxWhere 
18930 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20  = pPIWhere;.    
18940 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  pPIWhere = 0;.  
18950 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
18960 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
18970 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
18980 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
18990 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c   see if we shoul
189a0 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71  d honor DESC req
189b0 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63  uests on index c
189c0 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
189d0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
189e0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29  file_format>=4 )
189f0 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d  {.    sortOrderM
18a00 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48  ask = -1;   /* H
18a10 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d  onor DESC */.  }
18a20 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72  else{.    sortOr
18a30 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  derMask = 0;    
18a40 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a  /* Ignore DESC *
18a50 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  /.  }..  /* Scan
18a60 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
18a70 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
18a80 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
18a90 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  exed and.  ** lo
18aa0 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  ad the column in
18ab0 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49  dices into the I
18ac0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
18ad0 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
18ae0 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c  .  ** if any col
18af0 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  umn is not found
18b00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
18b10 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f  :  Add a test to
18b20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
18b30 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
18b40 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a  is not named.  *
18b50 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  * more than once
18b60 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
18b70 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
18b80 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
18b90 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c   of.  ** the col
18ba0 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65  umn will ever be
18bb0 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70 74   used by the opt
18bc0 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68  imizer.  Note th
18bd0 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  at using the.  *
18be0 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f  * same column mo
18bf0 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e  re than once can
18c00 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20  not be an error 
18c10 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
18c20 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62  ld .  ** break b
18c30 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
18c40 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64  bility - it need
18c50 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e  s to be a warnin
18c60 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  g..  */.  for(i=
18c70 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69  0, pListItem=pLi
18c80 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
18c90 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73  nExpr; i++, pLis
18ca0 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f  tItem++){.    co
18cb0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61  nst char *zColNa
18cc0 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  me = pListItem->
18cd0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 72  zName;.    int r
18ce0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
18cf0 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  r;.    char *zCo
18d00 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
18d10 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
18d20 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
18d30 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   */..    for(j=0
18d40 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
18d50 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
18d60 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c  ol; j++, pTabCol
18d70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
18d80 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
18d90 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d  olName, pTabCol-
18da0 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  >zName)==0 ) bre
18db0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
18dc0 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( j>=pTab->nCol 
18dd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18de0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
18df0 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e   "table %s has n
18e00 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25  o column named %
18e10 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
18e20 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d  ->zName, zColNam
18e30 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  e);.      pParse
18e40 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
18e50 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  1;.      goto ex
18e60 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18e70 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18e80 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a  t( j<=0x7fff );.
18e90 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
18ea0 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a  lumn[i] = (i16)j
18eb0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
18ec0 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20  tem->pExpr ){.  
18ed0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20      int nColl;. 
18ee0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
18ef0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f  stItem->pExpr->o
18f00 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
18f10 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
18f20 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
18f30 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
18f40 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   nColl = sqlite3
18f50 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20  Strlen30(zColl) 
18f60 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 1;.      asser
18f70 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c  t( nExtra>=nColl
18f80 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
18f90 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20  (zExtra, zColl, 
18fa0 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43  nColl);.      zC
18fb0 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  oll = zExtra;.  
18fc0 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43      zExtra += nC
18fd0 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  oll;.      nExtr
18fe0 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a -= nColl;.    
18ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f  }else{.      zCo
19000 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
19010 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
19020 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f  if( !zColl ) zCo
19030 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  ll = "BINARY";. 
19040 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
19050 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21  ->init.busy && !
19060 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
19070 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
19080 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ll) ){.      got
19090 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
190a0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
190b0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
190c0 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
190d0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
190e0 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
190f0 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
19100 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
19110 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
19120 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74  i] = (u8)request
19130 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  edSortOrder;.   
19140 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
19150 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20  j].notNull==0 ) 
19160 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e  pIndex->uniqNotN
19170 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ull = 0;.  }.  i
19180 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f  f( pPk ){.    fo
19190 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
191a0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
191b0 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e     int x = pPk->
191c0 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
191d0 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e     if( hasColumn
191e0 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  (pIndex->aiColum
191f0 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  n, pIndex->nKeyC
19200 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20  ol, x) ){.      
19210 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
19220 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73  n--; .      }els
19230 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  e{.        pInde
19240 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
19250 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   x;.        pInd
19260 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
19270 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a  pPk->azColl[j];.
19280 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
19290 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
192a0 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  pPk->aSortOrder[
192b0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  j];.        i++;
192c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
192d0 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49     assert( i==pI
192e0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  ndex->nColumn );
192f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
19300 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
19310 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 49 6e 64  ] = -1;.    pInd
19320 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
19330 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 20 20  "BINARY";.  }.  
19340 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
19350 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20  wEst(pIndex);.  
19360 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
19370 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d  Table==0 ) estim
19380 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
19390 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54  ndex);..  if( pT
193a0 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
193b0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
193c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
193d0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
193e0 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
193f0 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
19400 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
19410 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
19420 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
19430 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
19440 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
19450 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
19460 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
19470 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
19480 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
19490 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
194a0 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
194b0 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
194c0 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
194d0 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
194e0 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
194f0 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
19500 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
19510 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
19520 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
19530 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
19540 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
19550 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
19560 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
19570 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
19580 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
19590 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
195a0 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
195b0 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
195c0 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
195d0 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
195e0 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
195f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19600 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  wo UNIQUE or PRI
19610 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
19620 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ints are conside
19630 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20  red equivalent. 
19640 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20     ** (and thus 
19650 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20  suppressing the 
19660 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e  second one) even
19670 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69   if they have di
19680 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73  fferent.    ** s
19690 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20  ort orders..    
196a0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
196b0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
196c0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
196d0 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63  nces or if the c
196e0 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a  olumns of.    **
196f0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
19700 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65  occur in differe
19710 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20  nt orders, then 
19720 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  the constraints 
19730 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  are.    ** consi
19740 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61  dered distinct a
19750 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69  nd both result i
19760 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  n separate indic
19770 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
19780 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
19790 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
197a0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
197b0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
197c0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
197d0 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
197e0 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
197f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19800 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  pIdx->idxType!=S
19810 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
19820 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73  PDEF );.      as
19830 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
19840 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a  dex(pIndex) );..
19850 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
19860 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d  nKeyCol!=pIndex-
19870 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
19880 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
19890 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; k<pIdx->nKey
198a0 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Col; k++){.     
198b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
198c0 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
198d0 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
198e0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
198f0 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
19900 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
19910 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
19920 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
19930 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
19940 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
19950 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
19960 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74   z1!=z2 && sqlit
19970 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
19980 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
19990 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
199a0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
199b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
199c0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
199d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
199e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
199f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
19a00 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
19a10 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
19a20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
19a30 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
19a40 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
19a50 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
19a60 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
19a70 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
19a80 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
19a90 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
19aa0 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
19ab0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
19ac0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
19ad0 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
19ae0 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
19af0 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
19b00 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
19b10 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
19b20 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
19b30 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
19b40 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
19b50 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
19b60 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
19b70 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
19b80 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
19b90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
19ba0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
19bb0 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
19bc0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
19bd0 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
19be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19bf0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19c00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19c10 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
19c20 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
19c30 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
19c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19c50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
19c60 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
19c70 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
19c80 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
19c90 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
19ca0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
19cb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
19cc0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19cd0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19ce0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
19cf0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
19d00 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
19d10 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
19d20 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
19d30 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
19d40 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
19d50 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
19d60 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
19d70 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
19d80 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
19d90 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
19da0 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
19db0 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
19dc0 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
19dd0 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
19de0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
19df0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
19e10 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64  dex->zName, pInd
19e20 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  ex);.    if( p )
19e30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19e40 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
19e50 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
19e60 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
19e70 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
19e80 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  ed = 1;.      go
19e90 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19ea0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
19eb0 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
19ec0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
19ed0 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e  s;.    if( pTblN
19ee0 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
19ef0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
19f00 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
19f10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19f20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
19f30 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20 49  initial CREATE I
19f40 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28  NDEX statement (
19f50 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  or CREATE TABLE 
19f60 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  if the.  ** inde
19f70 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20  x is an implied 
19f80 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51  index for a UNIQ
19f90 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
19fa0 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68  Y constraint) th
19fb0 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64  en.  ** emit cod
19fc0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  e to allocate th
19fd0 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65  e index rootpage
19fe0 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b   on disk and mak
19ff0 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20  e an entry for. 
1a000 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e   ** the index in
1a010 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1a020 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70  er table and pop
1a030 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ulate the index 
1a040 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  with.  ** conten
1a050 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20  t.  But, do not 
1a060 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72  do this if we ar
1a070 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67  e simply reading
1a080 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1a090 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f  er.  ** table to
1a0a0 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d   parse the schem
1a0b0 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e  a, or if this in
1a0c0 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41  dex is the PRIMA
1a0d0 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a  RY KEY index.  *
1a0e0 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52  * of a WITHOUT R
1a0f0 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a  OWID table..  **
1a100 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d  .  ** If pTblNam
1a110 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
1a120 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65  is index is gene
1a130 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c  rated as an impl
1a140 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a  ied PRIMARY KEY.
1a150 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69    ** or UNIQUE i
1a160 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54 45  ndex in a CREATE
1a170 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1a180 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
1a190 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
1a1a0 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
1a1b0 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
1a1c0 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
1a1d0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1a1e0 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
1a1f0 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
1a200 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65   else if( pParse
1a210 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 48 61  ->nErr==0 && (Ha
1a220 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
1a230 70 54 62 6c 4e 61 6d 65 21 3d 30 29 20 29 7b 0a  pTblName!=0) ){.
1a240 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
1a250 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
1a260 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
1a270 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
1a280 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1a290 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1a2a0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
1a2b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a2c0 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72  dex;...    /* Cr
1a2d0 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
1a2e0 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
1a2f0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1a300 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1a310 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1a320 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1a330 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a340 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
1a350 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20  iDb, iMem);..   
1a360 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
1a370 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
1a380 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
1a390 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
1a3a0 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
1a3b0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
1a3c0 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
1a3d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
1a3e0 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73   (int)(pParse->s
1a3f0 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e  LastToken.z - pN
1a400 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65  ame->z) + pParse
1a410 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a  ->sLastToken.n;.
1a420 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d        if( pName-
1a430 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e  >z[n-1]==';' ) n
1a440 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e  --;.      /* A n
1a450 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
1a460 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
1a470 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1a480 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  nt */.      zStm
1a490 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1a4a0 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73  tf(db, "CREATE%s
1a4b0 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
1a4c0 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
1a4d0 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
1a4e0 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d  UNIQUE", n, pNam
1a4f0 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e->z);.    }else
1a500 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75  {.      /* An au
1a510 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72  tomatic index cr
1a520 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41  eated by a PRIMA
1a530 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
1a540 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
1a550 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20       /* zStmt = 
1a560 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
1a570 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  "); */.      zSt
1a580 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  mt = 0;.    }.. 
1a590 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74     /* Add an ent
1a5a0 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73  ry in sqlite_mas
1a5b0 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ter for this ind
1a5c0 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
1a5d0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1a5e0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1a5f0 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25    "INSERT INTO %
1a600 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64  Q.%s VALUES('ind
1a610 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51  ex',%Q,%Q,#%d,%Q
1a620 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d  );",.        db-
1a630 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
1a640 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1a650 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64  b),.        pInd
1a660 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ex->zName,.     
1a670 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
1a680 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20          iMem,.  
1a690 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
1a6a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1a6b0 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
1a6c0 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68  ..    /* Fill th
1a6d0 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74  e index with dat
1a6e0 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68  a and reparse th
1a6f0 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61  e schema. Code a
1a700 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20  n OP_Expire.    
1a710 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
1a720 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
1a730 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
1a740 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62    */.    if( pTb
1a750 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  lName ){.      s
1a760 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1a770 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1a780 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73  , iMem);.      s
1a790 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1a7a0 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1a7b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a7c0 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
1a7d0 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20  Op(v, iDb,.     
1a7e0 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
1a7f0 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71  tf(db, "name='%q
1a800 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  ' AND type='inde
1a810 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  x'", pIndex->zNa
1a820 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
1a830 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a840 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a   OP_Expire, 0);.
1a850 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a860 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
1a870 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
1a880 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
1a890 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
1a8a0 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
1a8b0 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
1a8c0 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
1a8d0 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
1a8e0 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
1a8f0 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
1a900 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
1a910 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e  orrect constrain
1a920 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f  t check.  ** pro
1a930 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69  cessing (in sqli
1a940 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74  te3GenerateConst
1a950 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61  raintChecks()) a
1a960 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55  s part of.  ** U
1a970 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54  PDATE and INSERT
1a980 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20   statements.  . 
1a990 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
1a9a0 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
1a9b0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
1a9c0 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
1a9d0 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
1a9e0 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
1a9f0 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
1aa00 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
1aa10 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
1aa20 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1aa30 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1aa40 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
1aa50 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
1aa60 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
1aa70 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
1aa80 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
1aa90 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
1aaa0 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
1aab0 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
1aac0 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
1aad0 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
1aae0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
1aaf0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
1ab00 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
1ab10 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
1ab20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
1ab30 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
1ab40 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b    pRet = pIndex;
1ab50 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
1ab60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
1ab70 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
1ab80 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
1ab90 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
1aba0 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64 65  Index ) freeInde
1abb0 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
1abc0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1abd0 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29  te(db, pPIWhere)
1abe0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
1abf0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1ac00 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
1ac10 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1ac20 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
1ac30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ac40 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
1ac50 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
1ac60 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
1ac70 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
1ac80 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
1ac90 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
1aca0 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
1acb0 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
1acc0 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
1acd0 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
1ace0 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
1acf0 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
1ad00 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1ad10 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1ad20 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
1ad30 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
1ad40 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
1ad50 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
1ad60 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
1ad70 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
1ad80 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1ad90 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
1ada0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1adb0 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
1adc0 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
1add0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
1ade0 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
1adf0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1ae00 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
1ae10 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
1ae20 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
1ae30 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
1ae40 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
1ae50 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
1ae60 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
1ae70 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
1ae80 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1ae90 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
1aea0 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
1aeb0 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
1aec0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1aed0 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
1aee0 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
1aef0 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
1af00 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
1af10 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
1af20 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
1af30 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
1af40 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
1af50 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
1af60 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
1af70 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
1af80 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
1af90 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
1afa0 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
1afb0 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
1afc0 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20  Idx){.  /*      
1afd0 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39            10,  9
1afe0 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a  ,  8,  7,  6 */.
1aff0 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20    LogEst aVal[] 
1b000 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20  = { 33, 32, 30, 
1b010 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45  28, 26 };.  LogE
1b020 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  st *a = pIdx->ai
1b030 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74  RowLogEst;.  int
1b040 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72   nCopy = MIN(Arr
1b050 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49  aySize(aVal), pI
1b060 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  dx->nKeyCol);.  
1b070 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74  int i;..  /* Set
1b080 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1b090 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73   (number of rows
1b0a0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74   in the index) t
1b0b0 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
1b0c0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
1b0d0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1b0e0 65 2e 20 4f 72 20 31 30 2c 20 69 66 20 74 68 65  e. Or 10, if the
1b0f0 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
1b100 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20  r of rows .  ** 
1b110 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  in the table is 
1b120 6c 65 73 73 20 74 68 61 6e 20 74 68 61 74 2e 20  less than that. 
1b130 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64   */.  a[0] = pId
1b140 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  x->pTable->nRowL
1b150 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30  ogEst;.  if( a[0
1b160 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33  ]<33 ) a[0] = 33
1b170 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
1b180 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1b190 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1b1a0 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1b1b0 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1b1c0 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1b1d0 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1b1e0 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1b1f0 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1b200 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1b210 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1b220 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1b230 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1b240 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1b250 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1b260 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1b270 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1b290 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1b2a0 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1b2b0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1b2c0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1b2d0 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  ) );.  if( IsUni
1b2e0 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1b2f0 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   a[pIdx->nKeyCol
1b300 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1b310 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1b320 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
1b330 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
1b340 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1b350 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1b360 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
1b370 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1b380 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
1b390 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1b3a0 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
1b3b0 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
1b3c0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1b3d0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
1b3e0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1b3f0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
1b400 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1b410 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
1b420 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
1b430 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
1b440 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
1b450 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1b460 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1b470 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
1b480 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
1b490 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
1b4a0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1b4b0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1b4c0 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
1b4d0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1b4e0 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1b4f0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1b500 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
1b510 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
1b520 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1b530 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
1b540 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
1b550 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
1b560 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b570 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1b580 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
1b590 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1b5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1b5b0 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1b5c0 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
1b5d0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1b5e0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1b5f0 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1b600 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
1b610 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1b620 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
1b630 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1b640 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1b650 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  F ){.    sqlite3
1b660 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1b670 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1b680 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1b690 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1b6a0 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1b6b0 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1b6c0 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1b6d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1b6e0 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1b6f0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1b700 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1b710 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
1b720 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1b730 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
1b740 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
1b750 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
1b760 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
1b770 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
1b780 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
1b790 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
1b7a0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1b7b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1b7c0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
1b7d0 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28  LE(iDb);.    if(
1b7e0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1b7f0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1b800 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
1b810 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1b820 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1b830 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1b840 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
1b850 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d   && iDb ) code =
1b860 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
1b870 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
1b880 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1b890 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
1b8a0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
1b8b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
1b8c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1b8d0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1b8e0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1b8f0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b900 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
1b910 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
1b920 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
1b930 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
1b940 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1b950 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1b960 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1b970 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1b980 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
1b990 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1b9a0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
1b9b0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
1b9c0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
1b9d0 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27  me=%Q AND type='
1b9e0 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20  index'",.       
1b9f0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1ba00 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
1ba10 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a  (iDb), pIndex->z
1ba20 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
1ba30 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
1ba40 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
1ba50 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65  Db, "idx", pInde
1ba60 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  x->zName);.    s
1ba70 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1ba80 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1ba90 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
1baa0 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
1bab0 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
1bac0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1bad0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
1bae0 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
1baf0 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
1bb00 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
1bb10 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
1bb20 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1bb30 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
1bb40 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69  ../*.** pArray i
1bb50 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1bb60 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  n array of objec
1bb70 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20  ts. Each object 
1bb80 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  in the.** array 
1bb90 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73  is szEntry bytes
1bba0 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72   in size. This r
1bbb0 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69  outine uses sqli
1bbc0 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a  te3DbRealloc().*
1bbd0 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  * to extend the 
1bbe0 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68  array so that th
1bbf0 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72  ere is space for
1bc00 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74   a new object at
1bc10 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20   the end..**.** 
1bc20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
1bc30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
1bc40 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20  nEntry contains 
1bc50 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1bc60 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79   of.** the array
1bc70 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73   (in entries - s
1bc80 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  o the allocation
1bc90 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20   is ((*pnEntry) 
1bca0 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73  * szEntry) bytes
1bcb0 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a  .** in total)..*
1bcc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c  *.** If the real
1bcd0 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73  loc() is success
1bce0 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20  ful (i.e. if no 
1bcf0 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63  OOM condition oc
1bd00 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70  curs), the.** sp
1bd10 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1bd20 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  r the new object
1bd30 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45   is zeroed, *pnE
1bd40 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a  ntry updated to.
1bd50 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e  ** reflect the n
1bd60 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  ew size of the a
1bd70 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74  rray and a point
1bd80 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c  er to the new al
1bd90 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  location.** retu
1bda0 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73  rned. *pIdx is s
1bdb0 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
1bdc0 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79  of the new array
1bdd0 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63   entry in this c
1bde0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ase..**.** Other
1bdf0 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61  wise, if the rea
1be00 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70  lloc() fails, *p
1be10 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Idx is set to -1
1be20 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69  , *pnEntry remai
1be30 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  ns.** unchanged 
1be40 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41  and a copy of pA
1be50 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a  rray returned..*
1be60 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41  /.void *sqlite3A
1be70 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1be80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1be90 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1bea0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1beb0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1bec0 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20    void *pArray, 
1bed0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1bee0 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20  objects.  Might 
1bef0 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a  be reallocated *
1bf00 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c  /.  int szEntry,
1bf10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1bf20 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   each object in 
1bf30 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  the array */.  i
1bf40 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20  nt *pnEntry,    
1bf50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62   /* Number of ob
1bf60 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20  jects currently 
1bf70 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  in use */.  int 
1bf80 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
1bf90 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
1bfa0 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
1bfb0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
1bfc0 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a   *z;.  int n = *
1bfd0 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28  pnEntry;.  if( (
1bfe0 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b  n & (n-1))==0 ){
1bff0 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e  .    int sz = (n
1c000 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a  ==0) ? 1 : 2*n;.
1c010 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1c020 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1c030 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a  c(db, pArray, sz
1c040 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69  *szEntry);.    i
1c050 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1c060 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a      *pIdx = -1;.
1c070 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72        return pAr
1c080 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ray;.    }.    p
1c090 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
1c0a0 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
1c0b0 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
1c0c0 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  &z[n * szEntry],
1c0d0 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
1c0e0 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a  *pIdx = n;.  ++*
1c0f0 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72  pnEntry;.  retur
1c100 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a  n pArray;.}../*.
1c110 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
1c120 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
1c130 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
1c140 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
1c150 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1c160 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
1c170 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1c180 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
1c190 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
1c1a0 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
1c1b0 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74  ListAppend(sqlit
1c1c0 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1c1d0 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1c1e0 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
1c1f0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1c200 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1c210 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1c220 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
1c230 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1c240 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1c250 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1c260 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
1c270 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1c280 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
1c290 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
1c2a0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
1c2b0 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
1c2c0 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
1c2d0 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
1c2e0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1c2f0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1c300 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1c310 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
1c320 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
1c330 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1c340 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  db, pToken);.  r
1c350 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1c360 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
1c370 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
1c380 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1c390 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1c3a0 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b   IdList *pList){
1c3b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1c3c0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1c3d0 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1c3e0 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1c3f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1c400 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1c410 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
1c420 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c430 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
1c440 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c450 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1c460 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1c470 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66  ndex in pList of
1c480 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   the identifier 
1c490 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75  named zId.  Retu
1c4a0 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20  rn -1.** if not 
1c4b0 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
1c4c0 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1c4d0 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
1c4e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1c4f0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
1c500 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1c510 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
1c520 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1c530 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1c540 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1c550 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1c560 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
1c570 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
1c580 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
1c590 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61  * Expand the spa
1c5a0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1c5b0 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1c5c0 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20  st object by.** 
1c5d0 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20  creating nExtra 
1c5e0 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e  new slots beginn
1c5f0 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20  ing at iStart.  
1c600 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62  iStart is zero b
1c610 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f  ased..** New slo
1c620 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ts are zeroed..*
1c630 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1c640 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c  , suppose a SrcL
1c650 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f  ist initially co
1c660 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69  ntains two entri
1c670 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61  es: A,B..** To a
1c680 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72  ppend 3 new entr
1c690 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ies onto the end
1c6a0 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  , do this:.**.**
1c6b0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1c6c0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1c6d0 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a  rclist, 3, 2);.*
1c6e0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63  *.** After the c
1c6f0 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75  all above it wou
1c700 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20  ld contain:  A, 
1c710 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  B, nil, nil, nil
1c720 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61  ..** If the iSta
1c730 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20  rt argument had 
1c740 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f  been 1 instead o
1c750 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65  f 2, then the re
1c760 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  sult.** would ha
1c770 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c  ve been:  A, nil
1c780 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20  , nil, nil, B.  
1c790 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e  To prepend the n
1c7a0 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65  ew slots,.** the
1c7b0 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f   iStart value wo
1c7c0 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72  uld be 0.  The r
1c7d0 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64  esult then would
1c7e0 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c  .** be: nil, nil
1c7f0 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a  , nil, A, B..**.
1c800 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
1c810 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  llocation fails 
1c820 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75  the SrcList is u
1c830 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a  nchanged.  The.*
1c840 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  * db->mallocFail
1c850 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20  ed flag will be 
1c860 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a  set to true..*/.
1c870 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1c880 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a  SrcListEnlarge(.
1c890 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1c8a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1c8b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   connection to n
1c8c0 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72  otify of OOM err
1c8d0 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ors */.  SrcList
1c8e0 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
1c8f0 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65  he SrcList to be
1c900 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69   enlarged */.  i
1c910 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
1c920 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
1c930 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20  ew slots to add 
1c940 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a  to pSrc->a[] */.
1c950 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20    int iStart    
1c960 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1c970 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69   pSrc->a[] of fi
1c980 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a  rst new slot */.
1c990 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
1c9a0 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
1c9b0 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72  g on calling par
1c9c0 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73  ameters */.  ass
1c9d0 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29  ert( iStart>=0 )
1c9e0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  ;.  assert( nExt
1c9f0 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ra>=1 );.  asser
1ca00 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1ca10 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
1ca20 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20  pSrc->nSrc );.. 
1ca30 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64   /* Allocate add
1ca40 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66  itional space if
1ca50 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28   needed */.  if(
1ca60 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63   (u32)pSrc->nSrc
1ca70 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
1ca80 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
1ca90 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
1caa0 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
1cab0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
1cac0 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
1cad0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1cae0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
1caf0 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
1cb00 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
1cb10 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
1cb20 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
1cb30 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1cb40 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1cb50 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1cb60 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
1cb70 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
1cb80 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
1cb90 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
1cba0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
1cbb0 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
1cbc0 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
1cbd0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
1cbe0 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
1cbf0 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a  loc = nGot;.  }.
1cc00 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74  .  /* Move exist
1cc10 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63  ing slots that c
1cc20 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65  ome after the ne
1cc30 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f  wly inserted slo
1cc40 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74  ts.  ** out of t
1cc50 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28  he way */.  for(
1cc60 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
1cc70 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b  i>=iStart; i--){
1cc80 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e  .    pSrc->a[i+n
1cc90 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61  Extra] = pSrc->a
1cca0 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d  [i];.  }.  pSrc-
1ccb0 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b  >nSrc += nExtra;
1ccc0 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
1ccd0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
1cce0 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
1ccf0 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
1cd00 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
1cd10 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
1cd20 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
1cd30 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
1cd40 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
1cd50 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
1cd60 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1cd70 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1cd80 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
1cd90 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
1cda0 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
1cdb0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1cdc0 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
1cdd0 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1cde0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
1cdf0 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
1ce00 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
1ce10 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
1ce20 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
1ce30 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
1ce40 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
1ce50 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
1ce60 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1ce70 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
1ce80 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
1ce90 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
1cea0 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
1ceb0 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
1cec0 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
1ced0 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
1cee0 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
1cef0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
1cf00 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
1cf10 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
1cf20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
1cf30 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
1cf40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
1cf50 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
1cf60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
1cf70 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
1cf80 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1cf90 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
1cfa0 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
1cfb0 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
1cfc0 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
1cfd0 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
1cfe0 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
1cff0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
1d000 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
1d010 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
1d020 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
1d030 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
1d040 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
1d050 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
1d060 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
1d070 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
1d080 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
1d090 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
1d0a0 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
1d0b0 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
1d0c0 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
1d0d0 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
1d0e0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
1d0f0 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
1d100 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
1d110 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
1d120 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
1d130 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
1d140 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
1d150 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
1d160 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1d170 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1d180 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
1d190 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
1d1a0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1d1b0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
1d1c0 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
1d1d0 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
1d1e0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1d1f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1d200 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
1d210 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
1d220 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
1d230 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
1d240 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
1d250 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64   If C is defined
1d260 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42  .** then so is B
1d270 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1d280 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65  s, we never have
1d290 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a   a case where:.*
1d2a0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1d2b0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1d2c0 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,0,C);.**.*
1d2d0 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e  * Both pTable an
1d2e0 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20  d pDatabase are 
1d2f0 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75  assumed to be qu
1d300 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20  oted.  They are 
1d310 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f  dequoted.** befo
1d320 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  re being added t
1d330 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a  o the SrcList..*
1d340 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1d350 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1d360 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1d370 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1d380 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1d390 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1d3a0 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1d3b0 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
1d3c0 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
1d3d0 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
1d3e0 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
1d3f0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1d400 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
1d410 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
1d420 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1d430 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
1d440 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
1d450 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1d460 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1d470 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  m;.  assert( pDa
1d480 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
1d490 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
1d4a0 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
1d4b0 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70  out B */.  if( p
1d4c0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1d4d0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1d4e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1d4f0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
1d500 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1d510 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1d520 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1d530 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73   = 1;.  }.  pLis
1d540 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  t = sqlite3SrcLi
1d550 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c  stEnlarge(db, pL
1d560 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e  ist, 1, pList->n
1d570 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  Src);.  if( db->
1d580 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1d590 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1d5a0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1d5b0 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1d5c0 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
1d5d0 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
1d5e0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
1d5f0 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
1d600 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
1d610 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1d620 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
1d630 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54  atabase ){.    T
1d640 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
1d650 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
1d660 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
1d670 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
1d680 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
1d690 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
1d6a0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1d6b0 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49  b, pTable);.  pI
1d6c0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1d6d0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1d6e0 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62  Token(db, pDatab
1d6f0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ase);.  return p
1d700 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
1d710 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72  ssign VdbeCursor
1d720 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74   index numbers t
1d730 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
1d740 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
1d750 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1d760 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
1d770 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1d780 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1d790 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1d7a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1d7b0 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
1d7c0 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
1d7d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d7e0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
1d7f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
1d800 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
1d810 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1d820 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1d830 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
1d840 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
1d850 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
1d860 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
1d870 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
1d880 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
1d890 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1d8a0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1d8b0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
1d8c0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
1d8d0 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
1d8e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1d8f0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
1d900 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
1d910 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
1d920 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
1d930 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1d940 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
1d950 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
1d960 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1d970 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1d980 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1d990 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1d9a0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
1d9b0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1d9c0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
1d9d0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1d9e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d9f0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
1da00 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
1da10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1da20 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1da30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1da40 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
1da50 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  s);.    sqlite3D
1da60 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1da70 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71  >zIndex);.    sq
1da80 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
1da90 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  (db, pItem->pTab
1daa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1dab0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1dac0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
1dad0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1dae0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1daf0 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
1db00 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1db10 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  b, pItem->pUsing
1db20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1db30 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1db40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1db50 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1db60 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1db70 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65   to add a new te
1db80 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  rm to the.** end
1db90 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52   of a growing FR
1dba0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
1dbb0 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
1dbc0 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   the part of.** 
1dbd0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1dbe0 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1dbf0 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
1dc00 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a  d.  "p" is NULL.
1dc10 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
1dc20 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
1dc30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
1dc40 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61    pTable and pDa
1dc50 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68  tabase.** are th
1dc60 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1dc70 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65  ble and database
1dc80 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
1dc90 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OM clause term..
1dca0 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20  ** pDatabase is 
1dcb0 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61  NULL if the data
1dcc0 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66  base name qualif
1dcd0 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d  ier is missing -
1dce0 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61   the.** usual ca
1dcf0 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  se.  If the term
1dd00 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74   has an alias, t
1dd10 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
1dd20 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
1dd30 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
1dd40 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
1dd50 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
1dd60 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
1dd70 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1dd80 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
1dd90 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
1dda0 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
1ddb0 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
1ddc0 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
1ddd0 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
1dde0 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
1ddf0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
1de00 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1de10 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
1de20 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1de30 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
1de40 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
1de50 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
1de60 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
1de70 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
1de80 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1de90 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
1dea0 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1deb0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
1dec0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1ded0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1dee0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1def0 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
1df00 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1df10 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
1df20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
1df30 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1df40 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1df50 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
1df60 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1df70 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
1df80 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
1df90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1dfa0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
1dfb0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
1dfc0 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
1dfd0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
1dfe0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
1dff0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
1e000 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1e010 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
1e020 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
1e030 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
1e040 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
1e050 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
1e060 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
1e070 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1e080 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
1e090 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
1e0a0 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
1e0b0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
1e0c0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1e0d0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1e0e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1e0f0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1e100 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70   !p && (pOn || p
1e110 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71  Using) ){.    sq
1e120 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1e130 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c  arse, "a JOIN cl
1e140 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
1e150 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20   before %s", .  
1e160 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20      (pOn ? "ON" 
1e170 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29  : "USING").    )
1e180 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  ;.    goto appen
1e190 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1e1a0 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53  }.  p = sqlite3S
1e1b0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1e1c0 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74   p, pTable, pDat
1e1d0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
1e1e0 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
1e1f0 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67  Src==0) ){.    g
1e200 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1e210 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74  error;.  }.  pIt
1e220 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
1e230 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  rc-1];.  assert(
1e240 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20   pAlias!=0 );.  
1e250 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b  if( pAlias->n ){
1e260 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
1e270 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
1e280 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
1e290 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
1e2a0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
1e2b0 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
1e2c0 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
1e2d0 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
1e2e0 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
1e2f0 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d  p;.. append_from
1e300 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74  _error:.  assert
1e310 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( p==0 );.  sqli
1e320 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1e330 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  , pOn);.  sqlite
1e340 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1e350 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c  , pUsing);.  sql
1e360 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1e370 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b  (db, pSubquery);
1e380 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1e390 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44  /*.** Add an IND
1e3a0 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49  EXED BY or NOT I
1e3b0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f  NDEXED clause to
1e3c0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1e3d0 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65  ly added .** ele
1e3e0 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72  ment of the sour
1e3f0 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  ce-list passed a
1e400 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1e410 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
1e420 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
1e430 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50  exedBy(Parse *pP
1e440 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1e450 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65  , Token *pIndexe
1e460 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  dBy){.  assert( 
1e470 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b  pIndexedBy!=0 );
1e480 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41  .  if( p && ALWA
1e490 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b  YS(p->nSrc>0) ){
1e4a0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1e4b0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1e4c0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1e4d0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1e4e0 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  pItem->notIndexe
1e4f0 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a  d==0 && pItem->z
1e500 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Index==0 );.    
1e510 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e  if( pIndexedBy->
1e520 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65  n==1 && !pIndexe
1e530 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  dBy->z ){.      
1e540 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45  /* A "NOT INDEXE
1e550 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75  D" clause was su
1e560 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73  pplied. See pars
1e570 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  e.y .      ** co
1e580 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64  nstruct "indexed
1e590 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c  _opt" for detail
1e5a0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65  s. */.      pIte
1e5b0 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  m->notIndexed = 
1e5c0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1e5d0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65      pItem->zInde
1e5e0 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  x = sqlite3NameF
1e5f0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1e600 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29  >db, pIndexedBy)
1e610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1e620 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
1e630 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
1e640 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
1e650 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
1e660 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
1e670 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
1e680 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
1e690 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
1e6a0 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
1e6b0 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
1e6c0 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
1e6d0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1e6e0 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1e6f0 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
1e700 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
1e710 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1e720 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
1e730 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
1e740 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
1e750 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
1e760 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
1e770 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
1e780 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1e790 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
1e7a0 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
1e7b0 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
1e7c0 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
1e7d0 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
1e7e0 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
1e7f0 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
1e800 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
1e810 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
1e820 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
1e830 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
1e840 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
1e850 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
1e860 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
1e870 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1e880 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
1e890 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
1e8a0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
1e8b0 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
1e8c0 20 70 2d 3e 61 20 7c 7c 20 70 2d 3e 6e 53 72 63   p->a || p->nSrc
1e8d0 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==0 );.    for(i
1e8e0 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
1e8f0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
1e900 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[i].jointype = 
1e910 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79  p->a[i-1].jointy
1e920 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
1e930 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[0].jointype =
1e940 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1e950 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
1e960 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1e970 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
1e980 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1e990 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
1e9a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e9b0 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
1e9c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1e9d0 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1e9e0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1e9f0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1ea00 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1ea10 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1ea20 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1ea30 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ea40 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1ea50 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
1ea60 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
1ea70 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
1ea80 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1ea90 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1eaa0 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
1eab0 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
1eac0 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
1ead0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1eae0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1eaf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1eb00 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
1eb10 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
1eb20 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
1eb30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1eb40 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20  esBtree(v, i);. 
1eb50 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1eb60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1eb70 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30  OP_AutoCommit, 0
1eb80 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
1eb90 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
1eba0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1ebb0 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  te3CommitTransac
1ebc0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1ebd0 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
1ebe0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1ebf0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
1ec00 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
1ec10 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1ec20 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1ec30 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1ec40 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
1ec50 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1ec60 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1ec70 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1ec80 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1ec90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1eca0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1ecb0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1ecc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1ecd0 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1ece0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1ecf0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1ed00 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1ed10 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
1ed20 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
1ed30 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
1ed40 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
1ed50 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
1ed60 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1ed70 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1ed80 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
1ed90 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
1eda0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1edb0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1edc0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1edd0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1ede0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1edf0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1ee00 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
1ee10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ee20 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1ee30 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
1ee40 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
1ee50 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
1ee60 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1ee70 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
1ee80 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
1ee90 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
1eea0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1eeb0 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
1eec0 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
1eed0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1eee0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1eef0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
1ef00 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1ef10 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1ef20 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1ef30 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
1ef40 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1ef50 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
1ef60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
1ef70 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
1ef80 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
1ef90 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
1efa0 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
1efb0 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
1efc0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1efd0 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
1efe0 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
1eff0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
1f000 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
1f010 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1f020 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
1f030 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
1f040 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1f050 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1f060 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
1f070 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1f080 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1f090 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
1f0a0 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
1f0b0 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
1f0c0 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
1f0d0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1f0e0 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
1f0f0 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
1f100 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
1f110 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
1f120 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
1f130 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
1f140 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
1f150 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1f160 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f170 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1f180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1f190 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1f1a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1f1b0 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
1f1c0 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
1f1d0 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
1f1e0 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
1f1f0 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
1f200 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
1f210 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
1f220 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1f230 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
1f240 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1f250 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
1f260 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1f270 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
1f280 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1f290 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1f2a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1f2b0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
1f2c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f2d0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1f2e0 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
1f2f0 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
1f300 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f310 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1f320 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1f330 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
1f340 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
1f350 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
1f360 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
1f370 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
1f380 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
1f390 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
1f3a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1f3b0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
1f3c0 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
1f3d0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1f3e0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
1f3f0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
1f400 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
1f410 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
1f420 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
1f430 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
1f440 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
1f450 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
1f460 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1f470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1f480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
1f490 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
1f4a0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
1f4b0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
1f4c0 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72   verified.** for
1f4d0 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20   database iDb.  
1f4e0 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75  The code to actu
1f4f0 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20  ally verify the 
1f500 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a  schema cookie.**
1f510 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74   will occur at t
1f520 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f  he end of the to
1f530 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64  p-level VDBE and
1f540 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
1f550 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20  ed.** later, by 
1f560 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
1f570 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ing()..*/.void s
1f580 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1f590 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
1f5a0 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
1f5b0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1f5c0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1f5d0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1f5e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
1f5f0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62   = pToplevel->db
1f600 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
1f610 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
1f620 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
1f630 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
1f640 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
1f650 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53  .  assert( iDb<S
1f660 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
1f670 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  ED+2 );.  assert
1f680 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1f690 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
1f6a0 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62  , 0) );.  if( Db
1f6b0 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76  MaskTest(pToplev
1f6c0 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20  el->cookieMask, 
1f6d0 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44  iDb)==0 ){.    D
1f6e0 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76  bMaskSet(pToplev
1f6f0 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20  el->cookieMask, 
1f700 69 44 62 29 3b 0a 20 20 20 20 70 54 6f 70 6c 65  iDb);.    pTople
1f710 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  vel->cookieValue
1f720 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
1f730 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
1f740 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
1f750 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1f760 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
1f770 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
1f780 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
1f790 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  plevel);.    }. 
1f7a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
1f7b0 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e  rgument zDb is N
1f7c0 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73  ULL, then call s
1f7d0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1f7e0 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63  Schema() for eac
1f7f0 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  h .** attached d
1f800 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69  atabase. Otherwi
1f810 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f  se, invoke it fo
1f820 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  r the database n
1f830 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a  amed zDb only..*
1f840 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1f850 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1f860 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
1f870 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1f880 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
1f890 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1f8a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1f8b0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1f8c0 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
1f8d0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
1f8e0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
1f8f0 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d  t && (!zDb || 0=
1f900 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1f910 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  zDb, pDb->zName)
1f920 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1f930 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1f940 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ma(pParse, i);. 
1f950 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1f960 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
1f970 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
1f980 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
1f990 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
1f9a0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
1f9b0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
1f9c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f9d0 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
1f9e0 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
1f9f0 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
1fa00 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
1fa10 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
1fa20 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
1fa30 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
1fa40 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
1fa50 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
1fa60 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
1fa70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
1fa80 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
1fa90 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
1faa0 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
1fab0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
1fac0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
1fad0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
1fae0 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
1faf0 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
1fb00 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
1fb10 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
1fb20 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
1fb30 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
1fb40 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
1fb50 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
1fb60 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
1fb70 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
1fb80 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
1fb90 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
1fba0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
1fbb0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
1fbc0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
1fbd0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
1fbe0 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
1fbf0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
1fc00 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
1fc10 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1fc20 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
1fc30 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
1fc40 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
1fc50 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1fc60 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1fc70 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1fc80 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  se);.  sqlite3Co
1fc90 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1fca0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44  Parse, iDb);.  D
1fcb0 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76  bMaskSet(pToplev
1fcc0 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69  el->writeMask, i
1fcd0 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  Db);.  pToplevel
1fce0 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c  ->isMultiWrite |
1fcf0 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a  = setStatement;.
1fd00 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
1fd10 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
1fd20 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75  ment currently u
1fd30 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1fd40 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a  n might write.**
1fd50 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
1fd60 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64  ntry (example: d
1fd70 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20  eleting one row 
1fd80 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61  then inserting a
1fd90 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72  nother,.** inser
1fda0 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ting multiple ro
1fdb0 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f  ws in a table, o
1fdc0 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f  r inserting a ro
1fdd0 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  w and index entr
1fde0 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61  ies.).** If an a
1fdf0 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65  bort occurs afte
1fe00 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  r some of these 
1fe10 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70  writes have comp
1fe20 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77  leted, then it w
1fe30 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  ill.** be necess
1fe40 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20  ary to undo the 
1fe50 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73  completed writes
1fe60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fe70 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73  3MultiWrite(Pars
1fe80 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
1fe90 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1fea0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1feb0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1fec0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
1fed0 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a  ltiWrite = 1;.}.
1fee0 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ./* .** The code
1fef0 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73   generator calls
1ff00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66   this routine if
1ff10 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68   is discovers th
1ff20 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73  at it is.** poss
1ff30 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20  ible to abort a 
1ff40 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20  statement prior 
1ff50 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20  to completion.  
1ff60 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20  In order to .** 
1ff70 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f  perform this abo
1ff80 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75  rt without corru
1ff90 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pting the databa
1ffa0 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  se, we need to m
1ffb0 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74  ake.** sure that
1ffc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
1ffd0 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  s protected by a
1ffe0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1fff0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65  action..**.** Te
20000 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e  chnically, we on
20010 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74  ly need to set t
20020 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67  he mayAbort flag
20030 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c   if the.** isMul
20040 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73  tiWrite flag was
20050 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e   previously set.
20060 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d    There is a tim
20070 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
20080 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62  such that the ab
20090 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61  ort must occur a
200a0 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72  fter the multiwr
200b0 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  ite.  This makes
200c0 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65  .** some stateme
200d0 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68  nts involving th
200e0 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69  e REPLACE confli
200f0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
20100 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20  gorithm.** go a 
20110 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20  little faster.  
20120 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e  But taking advan
20130 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d  tage of this tim
20140 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
20150 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69  makes it more di
20160 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65  fficult to prove
20170 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69   that the code i
20180 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a  s correct (in .*
20190 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74  * particular, it
201a0 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
201b0 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66  m writing an eff
201c0 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d  ective.** implem
201d0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69  entation of sqli
201e0 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
201f0 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68  t()) and so we h
20200 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f  ave chosen.** to
20210 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72   take the safe r
20220 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68  oute and skip th
20230 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
20240 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
20250 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70  ayAbort(Parse *p
20260 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
20270 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
20280 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
20290 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
202a0 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74  plevel->mayAbort
202b0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 1;.}../*.** C
202c0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74  ode an OP_Halt t
202d0 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76  hat causes the v
202e0 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  dbe to return an
202f0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
20300 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65  NT.** error. The
20310 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74   onError paramet
20320 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
20330 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20  ich (if any) of 
20340 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
20350 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20   and/or current 
20360 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
20370 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76  olled back..*/.v
20380 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43  oid sqlite3HaltC
20390 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
203a0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
203b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
203c0 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  t */.  int errCo
203d0 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65  de,      /* exte
203e0 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20  nded error code 
203f0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
20400 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
20410 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63  aint type */.  c
20420 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20  har *p4,        
20430 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
20440 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65  e */.  i8 p4type
20450 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53  ,        /* P4_S
20460 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e  TATIC or P4_TRAN
20470 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35  SIENT */.  u8 p5
20480 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20  Errmsg       /* 
20490 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a  P5_ErrMsg type *
204a0 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
204b0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
204c0 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
204d0 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66  t( (errCode&0xff
204e0 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
204f0 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e  AINT );.  if( on
20500 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20  Error==OE_Abort 
20510 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
20520 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
20530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
20540 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
20550 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45  lt, errCode, onE
20560 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74  rror, 0, p4, p4t
20570 79 70 65 29 3b 0a 20 20 69 66 28 20 70 35 45 72  ype);.  if( p5Er
20580 72 6d 73 67 20 29 20 73 71 6c 69 74 65 33 56 64  rmsg ) sqlite3Vd
20590 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
205a0 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
205b0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
205c0 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20  t due to UNIQUE 
205d0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
205e0 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
205f0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
20600 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
20610 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
20620 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
20630 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20640 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
20650 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
20660 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65  t type */.  Inde
20670 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a  x *pIdx       /*
20680 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
20690 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e  triggers the con
206a0 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
206b0 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  char *zErr;.  in
206c0 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t j;.  StrAccum 
206d0 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20  errMsg;.  Table 
206e0 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
206f0 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  able;..  sqlite3
20700 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72  StrAccumInit(&er
20710 72 4d 73 67 2c 20 30 2c 20 30 2c 20 32 30 30 29  rMsg, 0, 0, 200)
20720 3b 0a 20 20 65 72 72 4d 73 67 2e 64 62 20 3d 20  ;.  errMsg.db = 
20730 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f  pParse->db;.  fo
20740 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
20750 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
20760 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70    char *zCol = p
20770 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e  Tab->aCol[pIdx->
20780 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
20790 6d 65 3b 0a 20 20 20 20 69 66 28 20 6a 20 29 20  me;.    if( j ) 
207a0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
207b0 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22  ppend(&errMsg, "
207c0 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 73 71 6c  , ", 2);.    sql
207d0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
207e0 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70  ndAll(&errMsg, p
207f0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
20800 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
20810 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
20820 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ".", 1);.    sql
20830 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
20840 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a  ndAll(&errMsg, z
20850 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  Col);.  }.  zErr
20860 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
20870 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67  umFinish(&errMsg
20880 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74  );.  sqlite3Halt
20890 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
208a0 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72  e, .    IsPrimar
208b0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
208c0 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ? SQLITE_CONSTRA
208d0 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a  INT_PRIMARYKEY .
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51              : SQ
20900 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
20910 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72  UNIQUE,.    onEr
20920 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  ror, zErr, P4_DY
20930 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72  NAMIC, P5_Constr
20940 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
20950 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
20960 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f  P_Halt due to no
20970 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a  n-unique rowid..
20980 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
20990 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a  owidConstraint(.
209a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
209b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
209c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
209d0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
209e0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
209f0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a  tion algorithm *
20a00 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
20a10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
20a20 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d  le with the non-
20a30 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20  unique rowid */ 
20a40 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  .){.  char *zMsg
20a50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
20a60 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
20a70 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73   ){.    zMsg = s
20a80 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
20a90 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73  arse->db, "%s.%s
20aa0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ac0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
20ad0 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
20ae0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ].zName);.    rc
20af0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
20b00 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b  AINT_PRIMARYKEY;
20b10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d  .  }else{.    zM
20b20 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
20b30 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
20b40 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62  "%s.rowid", pTab
20b50 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ->zName);.    rc
20b60 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
20b70 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a  AINT_ROWID;.  }.
20b80 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
20b90 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
20ba0 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73  rc, onError, zMs
20bb0 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20  g, P4_DYNAMIC,. 
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bd0 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72         P5_Constr
20be0 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
20bf0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
20c00 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
20c10 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
20c20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
20c30 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
20c40 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
20c50 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
20c60 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
20c70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
20c80 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
20c90 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f  ollationMatch(co
20ca0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c  nst char *zColl,
20cb0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
20cc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
20cd0 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  rt( zColl!=0 );.
20ce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
20cf0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
20d00 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
20d10 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
20d20 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61  azColl[i];.    a
20d30 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70  ssert( z!=0 || p
20d40 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
20d50 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i]<0 );.    if( 
20d60 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
20d70 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c  [i]>=0 && 0==sql
20d80 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a  ite3StrICmp(z, z
20d90 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  Coll) ){.      r
20da0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
20db0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
20dc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
20dd0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
20de0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
20df0 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
20e00 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
20e10 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
20e20 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
20e30 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
20e40 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
20e50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
20e60 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
20e70 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
20e80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
20e90 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
20ea0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
20eb0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ed0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
20ee0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
20ef0 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
20f00 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
20f10 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
20f20 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
20f30 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
20f40 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
20f50 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
20f60 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
20f70 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
20f80 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
20f90 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
20fa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
20fb0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
20fc0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
20fd0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
20fe0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
20ff0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
21000 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
21010 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
21020 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
21030 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
21040 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
21050 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
21060 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
21070 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
21080 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
21090 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
210a0 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
210b0 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
210c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
210d0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
210e0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
210f0 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
21100 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
21110 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
21120 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
21130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21140 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
21150 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
21180 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
21190 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
211a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
211b0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
211c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
211d0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
211e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
211f0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
21200 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
21210 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21230 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
21240 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
21250 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
21260 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
21270 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e  xes(db) );  /* N
21280 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61  eeded for schema
21290 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72   access */.  for
212a0 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
212b0 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
212c0 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
212d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
212e0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b  !=0 );.    for(k
212f0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
21300 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
21310 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
21320 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
21330 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
21340 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
21350 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
21360 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
21370 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f  Parse, pTab, zCo
21380 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
21390 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
213a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
213b0 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
213c0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
213d0 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213f0 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
21400 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
21410 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
21420 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
21430 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
21440 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
21450 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
21460 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
21470 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
21480 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
21490 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
214a0 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
214b0 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
214c0 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
214d0 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
214e0 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
214f0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
21500 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
21510 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
21520 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
21530 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
21540 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
21550 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
21560 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
21570 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
21580 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
21590 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
215a0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
215b0 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
215c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
215d0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
215e0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
215f0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21610 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
21620 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
21630 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
21640 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21660 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
21670 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
21680 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
21690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
216a0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
216b0 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
216c0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
216d0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
216e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
216f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
21700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21710 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
21720 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
21730 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
21760 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
21770 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21780 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
21790 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
217a0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
217b0 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
217c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
217d0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
217e0 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
217f0 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
21800 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
21810 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
21820 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
21830 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
21840 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
21850 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
21860 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
21870 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
21880 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
21890 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
218a0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
218b0 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
218c0 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
218d0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
218e0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
218f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45  ;.  }else if( NE
21900 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c  VER(pName2==0) |
21910 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29  | pName2->z==0 )
21920 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  {.    char *zCol
21930 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  l;.    assert( p
21940 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20  Name1->z );.    
21950 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
21960 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
21970 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29  rse->db, pName1)
21980 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c  ;.    if( !zColl
21990 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
219a0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
219b0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
219c0 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
219d0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
219e0 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  ){.      reindex
219f0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
21a00 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
21a10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21a20 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
21a30 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
21a40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21a50 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, zColl);.  }.
21a60 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
21a70 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
21a80 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
21a90 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  2, &pObjName);. 
21aa0 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
21ab0 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
21ac0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
21ad0 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  db, pObjName);. 
21ae0 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
21af0 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  rn;.  zDb = db->
21b00 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
21b10 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
21b20 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
21b30 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
21b40 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
21b50 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
21b60 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
21b70 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
21b80 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
21b90 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
21ba0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
21bb0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c  , z, zDb);.  sql
21bc0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
21bd0 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
21be0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
21bf0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
21c00 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
21c10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
21c20 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
21c30 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
21c40 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
21c50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
21c60 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
21c70 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
21c80 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
21c90 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
21ca0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
21cb0 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  n a KeyInfo stru
21cc0 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70  cture that is ap
21cd0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
21ce0 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a  e given Index..*
21cf0 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e 66 6f  *.** The KeyInfo
21d00 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 61   structure for a
21d10 6e 20 69 6e 64 65 78 20 69 73 20 63 61 63 68 65  n index is cache
21d20 64 20 69 6e 20 74 68 65 20 49 6e 64 65 78 20 6f  d in the Index o
21d30 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74 68 65  bject..** So the
21d40 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c 74  re might be mult
21d50 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  iple references 
21d60 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  to the returned 
21d70 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a 2a 2a  pointer.  The.**
21d80 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
21d90 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64 69 66 79  ot try to modify
21da0 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
21db0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ect..**.** The c
21dc0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76  aller should inv
21dd0 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oke sqlite3KeyIn
21de0 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  foUnref() on the
21df0 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
21e00 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20  .** when it has 
21e10 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69  finished using i
21e20 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  t..*/.KeyInfo *s
21e30 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
21e40 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
21e50 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
21e60 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
21e70 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
21e80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21e90 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
21ea0 45 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4b  E.  if( pIdx->pK
21eb0 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d 3e  eyInfo && pIdx->
21ec0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 21 3d 70 50  pKeyInfo->db!=pP
21ed0 61 72 73 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20  arse->db ){.    
21ee0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
21ef0 72 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e  ref(pIdx->pKeyIn
21f00 66 6f 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 70  fo);.    pIdx->p
21f10 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 7d  KeyInfo = 0;.  }
21f20 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 49  .#endif.  if( pI
21f30 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  dx->pKeyInfo==0 
21f40 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
21f50 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
21f60 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
21f70 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d  int nKey = pIdx-
21f80 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 4b 65  >nKeyCol;.    Ke
21f90 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 20  yInfo *pKey;.   
21fa0 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e   if( pIdx->uniqN
21fb0 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  otNull ){.      
21fc0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
21fd0 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
21fe0 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f  e->db, nKey, nCo
21ff0 6c 2d 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c  l-nKey);.    }el
22000 73 65 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d  se{.      pKey =
22010 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
22020 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
22030 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d   nCol, 0);.    }
22040 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
22050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
22060 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
22070 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29  riteable(pKey) )
22080 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
22090 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
220a0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
220b0 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
220c0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  l[i];.        as
220d0 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
220e0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e  ;.        pKey->
220f0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 74 72 63 6d  aColl[i] = strcm
22100 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22  p(zColl,"BINARY"
22110 29 3d 3d 30 20 3f 20 30 20 3a 0a 20 20 20 20 20  )==0 ? 0 :.     
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
22140 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
22150 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
22160 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
22170 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
22180 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
22190 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
221a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
221b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
221c0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29  yInfoUnref(pKey)
221d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
221e0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 4b 65         pIdx->pKe
221f0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 3b 0a 20 20  yInfo = pKey;.  
22200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
22210 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
22220 4b 65 79 49 6e 66 6f 52 65 66 28 70 49 64 78 2d  KeyInfoRef(pIdx-
22230 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 7d 0a 0a 23  >pKeyInfo);.}..#
22240 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22250 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68  IT_CTE./* .** Th
22260 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
22270 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43  voked once per C
22280 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72  TE by the parser
22290 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61   while parsing a
222a0 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65   .** WITH clause
222b0 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69  . .*/.With *sqli
222c0 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61  te3WithAdd(.  Pa
222d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
222e0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
222f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69   context */.  Wi
22300 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
22310 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e        /* Existin
22320 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f  g WITH clause, o
22330 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
22340 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
22350 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
22360 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20  he common-table 
22370 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
22380 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20  Arglist,     /* 
22390 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20  Optional column 
223a0 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68  name list for th
223b0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c  e table */.  Sel
223c0 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20  ect *pQuery     
223d0 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73       /* Query us
223e0 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
223f0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
22400 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22410 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57   pParse->db;.  W
22420 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61  ith *pNew;.  cha
22430 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20  r *zName;..  /* 
22440 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43  Check that the C
22450 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  TE name is uniqu
22460 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49  e within this WI
22470 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20  TH clause. If.  
22480 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e  ** not, store an
22490 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61   error in the Pa
224a0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  rse structure. *
224b0 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
224c0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
224d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
224e0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
224f0 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20   && pWith ){.   
22500 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
22510 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
22520 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
22530 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
22540 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d  mp(zName, pWith-
22550 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
22560 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22570 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22580 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49  e, "duplicate WI
22590 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25  TH table name: %
225a0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
225b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
225c0 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
225d0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
225e0 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28  zeof(*pWith) + (
225f0 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b  sizeof(pWith->a[
22600 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74  1]) * pWith->nCt
22610 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  e);.    pNew = s
22620 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
22630 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65  db, pWith, nByte
22640 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22650 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
22660 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
22670 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a  izeof(*pWith));.
22680 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 4e    }.  assert( zN
22690 61 6d 65 21 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d  ame!=0 || pNew==
226a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  0 );.  assert( d
226b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
226c0 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b  =0 || pNew==0 );
226d0 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ..  if( pNew==0 
226e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
226f0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
22700 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20 20   pArglist);.    
22710 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
22720 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29 3b  ete(db, pQuery);
22730 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
22740 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
22750 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68 3b     pNew = pWith;
22760 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
22770 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
22780 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75 65  ].pSelect = pQue
22790 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  ry;.    pNew->a[
227a0 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c  pNew->nCte].pCol
227b0 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20 20  s = pArglist;.  
227c0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
227d0 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  nCte].zName = zN
227e0 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ame;.    pNew->a
227f0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 45 72  [pNew->nCte].zEr
22800 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  r = 0;.    pNew-
22810 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nCte++;.  }..  
22820 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
22830 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63  /*.** Free the c
22840 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57  ontents of the W
22850 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ith object passe
22860 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
22870 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
22880 64 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  d sqlite3WithDel
22890 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
228a0 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20   With *pWith){. 
228b0 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
228c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
228d0 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
228e0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
228f0 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
22900 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d  e = &pWith->a[i]
22910 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
22920 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
22930 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a  , pCte->pCols);.
22940 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
22950 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  ectDelete(db, pC
22960 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  te->pSelect);.  
22970 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
22980 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  e(db, pCte->zNam
22990 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
229a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
229b0 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pWith);.  }.}.#e
229c0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
229d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45  (SQLITE_OMIT_CTE
229e0 29 20 2a 2f 0a                                   ) */.