/ Hex Artifact Content
Login

Artifact 16051071cd855c23e47b087b49ac99c65b1d8c39:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
10e0: 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e  >nested ) return
10f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1100: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1110: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1120: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
1130: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72  SQLITE_OK ) pPar
1140: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1150: 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
1160: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
1170: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
1180: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
1190: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
11a0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
11b0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
11c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11e0: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
11f0: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20  >isMultiWrite . 
1200: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1210: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
1220: 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61  rt(v, pParse->ma
1230: 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20  yAbort));.  if( 
1240: 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  v ){.    while( 
1250: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1260: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20  ePriorOpcode(v, 
1270: 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20 20  OP_Close) ){}.  
1280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1290: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
12a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
12b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
12c0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
12d0: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3e 30 20 26 26  >nTableLock>0 &&
12e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
12f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1300: 65 33 55 73 65 72 41 75 74 68 49 6e 69 74 28 64  e3UserAuthInit(d
1310: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  b);.      if( db
1320: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
1330: 3c 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20  <UAUTH_User ){. 
1340: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
1350: 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 5f  c = SQLITE_AUTH_
1360: 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 73 71  USER;.        sq
1370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1380: 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20  arse, "user not 
1390: 61 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b  authenticated");
13a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
13b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
13c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13d0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
13e0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
13f0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1400: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
1410: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
1420: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
1430: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
1440: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
1450: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
1460: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
1470: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
1480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1490: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
14a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
14b0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
14c0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
14d0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
14e0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
14f0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
1500: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
1510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1520: 30 20 0a 20 20 20 20 20 26 26 20 28 44 62 4d 61  0 .     && (DbMa
1530: 73 6b 4e 6f 6e 5a 65 72 6f 28 70 50 61 72 73 65  skNonZero(pParse
1540: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 20 7c 7c  ->cookieMask) ||
1550: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1560: 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  xpr).    ){.    
1570: 20 20 69 6e 74 20 69 44 62 2c 20 69 3b 0a 20 20    int iDb, i;.  
1580: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1590: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15a0: 30 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  0)->opcode==OP_I
15b0: 6e 69 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nit );.      sql
15c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15d0: 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  (v, 0);.      fo
15e0: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
15f0: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
1600: 20 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b        if( DbMask
1610: 54 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Test(pParse->coo
1620: 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
1630: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1650: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
1660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1670: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1680: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  v,.          OP_
1690: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
16c0: 20 20 20 20 20 20 20 69 44 62 2c 20 20 20 20 20         iDb,     
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
16f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44 62 4d  */.          DbM
1700: 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d 3e  askTest(pParse->
1710: 77 72 69 74 65 4d 61 73 6b 2c 69 44 62 29 2c 20  writeMask,iDb), 
1720: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20  /* P2 */.       
1730: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1740: 65 56 61 6c 75 65 5b 69 44 62 5d 2c 20 20 20 20  eValue[iDb],    
1750: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
1760: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1770: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
1780: 47 65 6e 65 72 61 74 69 6f 6e 20 20 2f 2a 20 50  Generation  /* P
1790: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 3b 0a  4 */.        );.
17a0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
17b0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 73  init.busy==0 ) s
17c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17d0: 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  P5(v, 1);.      
17e0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17f0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1800: 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  LE.      for(i=0
1810: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61  ; i<pParse->nVta
1820: 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  bLock; i++){.   
1830: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
1840: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
1850: 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
1860: 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63  Parse->apVtabLoc
1870: 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  k[i]);.        s
1880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1890: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
18a0: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
18b0: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a  _VTAB);.      }.
18c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56        pParse->nV
18d0: 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e  tabLock = 0;.#en
18e0: 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  dif..      /* On
18f0: 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69  ce all the cooki
1900: 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72  es have been ver
1910: 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61  ified and transa
1920: 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a  ctions opened, .
1930: 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20        ** obtain 
1940: 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1950: 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69  le-locks. This i
1960: 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73  s a no-op unless
1970: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73   the .      ** s
1980: 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74  hared-cache feat
1990: 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ure is enabled..
19a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
19b0: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50  odeTableLocks(pP
19c0: 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  arse);..      /*
19d0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20   Initialize any 
19e0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61  AUTOINCREMENT da
19f0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65  ta structures re
1a00: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f  quired..      */
1a10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
1a20: 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e  toincrementBegin
1a30: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
1a40: 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e   /* Code constan
1a50: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  t expressions th
1a60: 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65  at where factore
1a70: 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c  d out of inner l
1a80: 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  oops */.      if
1a90: 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74  ( pParse->pConst
1aa0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1ab0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20  ExprList *pEL = 
1ac0: 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1ad0: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  pr;.        pPar
1ae0: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
1af0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  r = 0;.        f
1b00: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
1b10: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b30: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1b40: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1b50: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1b60: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1b70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1b80: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1b90: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1ba0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1bb0: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1bc0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1be0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 31 29 3b   OP_Goto, 0, 1);
1bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1c00: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
1c10: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
1c20: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
1c30: 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73    if( v && pPars
1c40: 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 64  e->nErr==0 && !d
1c50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c70: 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
1c80: 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73  el==0 );  /* Dis
1c90: 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e 61  ables and re-ena
1ca0: 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20  bles match */.  
1cb0: 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20 6f    /* A minimum o
1cc0: 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73 20  f one cursor is 
1cd0: 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74 6f  required if auto
1ce0: 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73 65  increment is use
1cf0: 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69 63  d.    *  See tic
1d00: 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66 30  ket [a696379c1f0
1d10: 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66 28  8866] */.    if(
1d20: 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21 3d   pParse->pAinc!=
1d30: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 61  0 && pParse->nTa
1d40: 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e 6e  b==0 ) pParse->n
1d50: 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  Tab = 1;.    sql
1d60: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
1d70: 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20 20  y(v, pParse);.  
1d80: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1d90: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1da0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
1db0: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
1dc0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
1dd0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1de0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1df0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
1e00: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
1e10: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
1e20: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20  .  pParse->nVar 
1e30: 3d 20 30 3b 0a 20 20 44 62 4d 61 73 6b 5a 65 72  = 0;.  DbMaskZer
1e40: 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  o(pParse->cookie
1e50: 4d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Mask);.}../*.** 
1e60: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
1e70: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
1e80: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
1e90: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
1ea0: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
1eb0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1ec0: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
1ed0: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
1ee0: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1ef0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1f00: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1f10: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1f20: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1f30: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1f40: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1f50: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1f60: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1f70: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1f80: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1f90: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1fa0: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1fb0: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1fc0: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1fd0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1fe0: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1ff0: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
2000: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
2010: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
2020: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
2030: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
2040: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
2050: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
2060: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
2070: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
2080: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
2090: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
20a0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
20b0: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
20c0: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
20d0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
20e0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
20f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
2100: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
2110: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
2120: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2130: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65  pParse->db;.# de
2140: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
2150: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
2160: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
2170: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
2180: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
2190: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
21a0: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
21b0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
21c0: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
21d0: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
21e0: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
21f0: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
2200: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2210: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
2220: 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20  te3VMPrintf(db, 
2230: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
2240: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
2250: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
2260: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
2270: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
2280: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
2290: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
22a0: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
22b0: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
22c0: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
22d0: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
22e0: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
22f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
2300: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
2310: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
2320: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2330: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b, zErrMsg);.  s
2340: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2350: 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79   zSql);.  memcpy
2360: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
2370: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
2380: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
2390: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
23a0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
23b0: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
23c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
23d0: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
23e0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
23f0: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
2400: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
2410: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
2420: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
2430: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2440: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2450: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2460: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
2470: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
2480: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
2490: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
24a0: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
24b0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
24c0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
24d0: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
24e0: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
24f0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2500: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2510: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2520: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2530: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2540: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2550: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2560: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2570: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
2580: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
2590: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
25a0: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
25b0: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
25c0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
25d0: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
25e0: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
25f0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
2600: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
2610: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2620: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
2630: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2640: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2650: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2660: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
2670: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2680: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2690: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
26a0: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
26b0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
26c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
26d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
26e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
26f0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
2700: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
2710: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
2720: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2730: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2740: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2750: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2760: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2770: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
2780: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
2790: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
27a0: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
27b0: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
27c0: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
27d0: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
27e0: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
27f0: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
2800: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
2810: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
2820: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
2830: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2840: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2850: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2860: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
2870: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ndif.  for(i=OMI
2880: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
2890: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
28a0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
28b0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
28c0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
28d0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
28e0: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
28f0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2900: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2910: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2920: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2930: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2940: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2950: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
2960: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2970: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2980: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2990: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
29a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
29b0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
29c0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
29d0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
29e0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
29f0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
2a00: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
2a10: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2a20: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
2a30: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
2a40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2a50: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2a60: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2a70: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2a80: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2a90: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2aa0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2ab0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2ac0: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2ad0: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2ae0: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2af0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2b00: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2b10: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
2b20: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2b30: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2b40: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
2b50: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
2b60: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
2b70: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2b80: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2b90: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2ba0: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2bb0: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2bc0: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
2bd0: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
2be0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
2bf0: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
2c00: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
2c10: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
2c20: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2c30: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2c40: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2c50: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2c60: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2c70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c80: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2c90: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2ca0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2cb0: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2cc0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2cd0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2ce0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2cf0: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2d00: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2d10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2d20: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2d30: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2d40: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2d50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2d60: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2d70: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2d80: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2d90: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2da0: 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
2db0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2dc0: 5f 54 41 42 4c 45 0a 20 20 20 20 2f 2a 20 49 66  _TABLE.    /* If
2dd0: 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 6f   zName is the no
2de0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
2df0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68  table in the sch
2e00: 65 6d 61 20 63 72 65 61 74 65 64 20 75 73 69 6e  ema created usin
2e10: 67 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 2c  g.    ** CREATE,
2e20: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
2e30: 65 65 20 69 66 20 69 74 20 69 73 20 74 68 65 20  ee if it is the 
2e40: 6e 61 6d 65 20 6f 66 20 61 6e 20 76 69 72 74 75  name of an virtu
2e50: 61 6c 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  al table that.  
2e60: 20 20 2a 2a 20 63 61 6e 20 62 65 20 61 6e 20 65    ** can be an e
2e70: 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c  ponymous virtual
2e80: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 4d   table. */.    M
2e90: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
2ea0: 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61  odule*)sqlite3Ha
2eb0: 73 68 46 69 6e 64 28 26 70 50 61 72 73 65 2d 3e  shFind(&pParse->
2ec0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61  db->aModule, zNa
2ed0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  me);.    if( pMo
2ee0: 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61 62  d && sqlite3Vtab
2ef0: 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e  EponymousTableIn
2f00: 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64 29  it(pParse, pMod)
2f10: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f20: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a   pMod->pEpoTab;.
2f30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2f40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73   const char *zMs
2f50: 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22 6e 6f  g = isView ? "no
2f60: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e   such view" : "n
2f70: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20  o such table";. 
2f80: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
2f90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
2fa0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2fb0: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
2fc0: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
2fd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2fe0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2ff0: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
3000: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65  %s", zMsg, zName
3010: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
3020: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
3030: 20 3d 20 31 3b 0a 20 20 7d 0a 23 69 66 20 53 51   = 1;.  }.#if SQ
3040: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
3050: 49 43 41 54 49 4f 4e 0a 20 20 65 6c 73 65 20 69  ICATION.  else i
3060: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  f( pParse->db->a
3070: 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41  uth.authLevel<UA
3080: 55 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20  UTH_User ){.    
3090: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
30a0: 70 50 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f  pParse, "user no
30b0: 74 20 61 75 74 68 65 6e 74 69 63 61 74 65 64 22  t authenticated"
30c0: 29 3b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20 20  );.    p = 0;.  
30d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
30e0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
30f0: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
3100: 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e  dentified by *p.
3110: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
3120: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
3130: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3140: 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72  le(). The differ
3150: 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ence between.** 
3160: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3170: 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75  le() and this fu
3180: 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74  nction is that t
3190: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
31a0: 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65  tricts.** the se
31b0: 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28  arch to schema (
31c0: 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69  p->pSchema) if i
31d0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70  t is not NULL. p
31e0: 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65  ->pSchema may be
31f0: 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20  .** non-NULL if 
3200: 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  it is part of a 
3210: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
3220: 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69  program definiti
3230: 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74  on. See.** sqlit
3240: 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66  e3FixSrcList() f
3250: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54  or details..*/.T
3260: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
3270: 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20  ateTableItem(.  
3280: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
3290: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 0a 20    int isView, . 
32a0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
32b0: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
32c0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
32d0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
32e0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
32f0: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
3300: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
3310: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3320: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
3330: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
3340: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
3350: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
3360: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
3370: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
3380: 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61 73  Db = p->zDatabas
3390: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
33a0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
33b0: 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56 69 65  le(pParse, isVie
33c0: 77 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  w, p->zName, zDb
33d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  );.}../*.** Loca
33e0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
33f0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
3400: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
3410: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
3420: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
3430: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
3440: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
3450: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
3460: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
3470: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
3480: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
3490: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
34a0: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
34b0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
34c0: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
34d0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
34e0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
34f0: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
3500: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
3510: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
3520: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
3530: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
3540: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
3550: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
3560: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
3570: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
3580: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
3590: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
35a0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
35b0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
35c0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
35d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
35e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
35f0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
3600: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f   0;.  int i;.  /
3610: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
3620: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
3630: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
3640: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
3650: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
3660: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
3670: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
3680: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
3690: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
36a0: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
36b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
36c0: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
36d0: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
36e0: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
36f0: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
3700: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
3710: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
3720: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
3730: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
3740: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
3750: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
3760: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
3770: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3780: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3790: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
37a0: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
37b0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
37c0: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
37d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
37e0: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
37f0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
3800: 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20  .** Reclaim the 
3810: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
3820: 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69  n index.*/.stati
3830: 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78  c void freeIndex
3840: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
3850: 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66  dex *p){.#ifndef
3860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41   SQLITE_OMIT_ANA
3870: 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 65  LYZE.  sqlite3De
3880: 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73  leteIndexSamples
3890: 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a  (db, p);.#endif.
38a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
38b0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74  ete(db, p->pPart
38c0: 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  IdxWhere);.  sql
38d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
38e0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66  ->zColAff);.  if
38f0: 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29  ( p->isResized )
3900: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3910: 62 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23  b, p->azColl);.#
3920: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3930: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
3940: 54 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  T4.  sqlite3_fre
3950: 65 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a  e(p->aiRowEst);.
3960: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3970: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3980: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
3990: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
39a0: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
39b0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
39c0: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
39d0: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
39e0: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
39f0: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
3a00: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
3a10: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
3a20: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
3a30: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3a40: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
3a50: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
3a60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
3a70: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
3a80: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
3a90: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
3aa0: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
3ab0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
3ac0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
3ad0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3ae0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3af0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
3b00: 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61    pHash = &db->a
3b10: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
3b20: 3e 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64  >idxHash;.  pInd
3b30: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
3b40: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
3b50: 64 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66  dxName, 0);.  if
3b60: 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29  ( ALWAYS(pIndex)
3b70: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   ){.    if( pInd
3b80: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3b90: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
3ba0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62      pIndex->pTab
3bb0: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  le->pIndex = pIn
3bc0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
3be0: 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20  ex *p;.      /* 
3bf0: 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66  Justification of
3c00: 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20   ALWAYS();  The 
3c10: 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e  index must be on
3c20: 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20   the list of.   
3c30: 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a     ** indices. *
3c40: 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64  /.      p = pInd
3c50: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3c60: 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
3c70: 20 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d   ALWAYS(p) && p-
3c80: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29  >pNext!=pIndex )
3c90: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20  { p = p->pNext; 
3ca0: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
3cb0: 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  YS(p && p->pNext
3cc0: 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  ==pIndex) ){.   
3cd0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
3ce0: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
3cf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3d00: 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70   freeIndex(db, p
3d10: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
3d20: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
3d30: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
3d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74  .}../*.** Look t
3d50: 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20  hrough the list 
3d60: 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  of open database
3d70: 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44   files in db->aD
3d80: 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e  b[] and if.** an
3d90: 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73  y have been clos
3da0: 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20  ed, remove them 
3db0: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20  from the list.  
3dc0: 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a  Reallocate the.*
3dd0: 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75  * db->aDb[] stru
3de0: 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c  cture to a small
3df0: 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73  er size, if poss
3e00: 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72  ible..**.** Entr
3e10: 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20  y 0 (the "main" 
3e20: 64 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e  database) and en
3e30: 74 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70  try 1 (the "temp
3e40: 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61  " database).** a
3e50: 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61  re never candida
3e60: 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f  tes for being co
3e70: 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  llapsed..*/.void
3e80: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
3e90: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71  DatabaseArray(sq
3ea0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
3eb0: 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
3ec0: 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  j=2; i<db->nDb; 
3ed0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
3ee0: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
3ef0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
3f00: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
3f10: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3f20: 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d  ee(db, pDb->zNam
3f30: 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  e);.      pDb->z
3f40: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
3f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
3f60: 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20      if( j<i ){. 
3f70: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20       db->aDb[j] 
3f80: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20  = db->aDb[i];.  
3f90: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d    }.    j++;.  }
3fa0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61  .  memset(&db->a
3fb0: 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e  Db[j], 0, (db->n
3fc0: 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d  Db-j)*sizeof(db-
3fd0: 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d  >aDb[j]));.  db-
3fe0: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
3ff0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
4000: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
4010: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
4020: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
4030: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
4040: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
4050: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
4060: 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29  ree(db, db->aDb)
4070: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
4080: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
4090: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65   }.}../*.** Rese
40a0: 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  t the schema for
40b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
40c0: 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73   index iDb.  Als
40d0: 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54  o reset the.** T
40e0: 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76  EMP schema..*/.v
40f0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
4100: 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65  OneSchema(sqlite
4110: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
4120: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73  .  Db *pDb;.  as
4130: 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
4140: 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20  b );..  /* Case 
4150: 31 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69  1:  Reset the si
4160: 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e  ngle schema iden
4170: 74 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f  tified by iDb */
4180: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
4190: 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74  b[iDb];.  assert
41a0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
41b0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
41c0: 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  , 0) );.  assert
41d0: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d  ( pDb->pSchema!=
41e0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  0 );.  sqlite3Sc
41f0: 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70  hemaClear(pDb->p
4200: 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49  Schema);..  /* I
4210: 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f  f any database o
4220: 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69  ther than TEMP i
4230: 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c  s reset, then al
4240: 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20  so reset TEMP.  
4250: 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69  ** since TEMP mi
4260: 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74  ght be holding t
4270: 72 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66  riggers that ref
4280: 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e  erence tables in
4290: 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
42a0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
42b0: 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20   if( iDb!=1 ){. 
42c0: 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44     pDb = &db->aD
42d0: 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  b[1];.    assert
42e0: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d  ( pDb->pSchema!=
42f0: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
4300: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
4310: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
4320: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
4330: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
4340: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
4350: 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64  rom all attached
4360: 20 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c   databases (incl
4370: 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20  uding.** "main" 
4380: 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20  and "temp") for 
4390: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
43a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
43b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
43c0: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
43d0: 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  nnection(sqlite3
43e0: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
43f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
4400: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f  terAll(db);.  fo
4410: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
4420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
4430: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
4440: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
4450: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
4460: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
4470: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
4480: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  );.    }.  }.  d
4490: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
44a0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
44b0: 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  s;.  sqlite3Vtab
44c0: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
44d0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
44e0: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71  aveAll(db);.  sq
44f0: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
4500: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
4510: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4520: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4530: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
4540: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
4550: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
4560: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
4570: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66  e3 *db){.  db->f
4580: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
4590: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
45a0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d  ../*.** Delete m
45b0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
45c0: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
45d0: 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ames of a table 
45e0: 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20  or view (the.** 
45f0: 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72  Table.aCol[] arr
4600: 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ay)..*/.void sql
4610: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
4620: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
4630: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
4640: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
4650: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
4660: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
4670: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
4680: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
4690: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
46a0: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
46b0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
46c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
46d0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
46e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
46f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4700: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
4710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4720: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
4730: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
4740: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
4750: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
4760: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4770: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
4780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4790: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
47a0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
47b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
47c0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
47d0: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
47e0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
47f0: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
4800: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
4810: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
4820: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
4830: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4840: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
4850: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4860: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
4870: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
4880: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
4890: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
48a0: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
48b0: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
48c0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
48d0: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
48e0: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
48f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4900: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
4910: 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72  **.** The db par
4920: 61 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e  ameter is option
4930: 61 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65  al.  It is neede
4940: 64 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f  d if the Table o
4950: 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  bject .** contai
4960: 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  ns lookaside mem
4970: 6f 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a  ory.  (Table obj
4980: 65 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ects in the sche
4990: 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a  ma do not use.**
49a0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
49b0: 79 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65  y, but some ephe
49c0: 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
49d0: 63 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65  cts do.)  Or the
49e0: 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72  .** db parameter
49f0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
4a00: 68 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  h db->pnBytesFre
4a10: 65 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68  ed to measure th
4a20: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64  e memory.** used
4a30: 20 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62   by the Table ob
4a40: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
4a50: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
4a60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4a70: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4a80: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
4a90: 70 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c  pNext;.  TESTONL
4aa0: 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64  Y( int nLookasid
4ab0: 65 3b 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20  e; ) /* Used to 
4ac0: 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65  verify lookaside
4ad0: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63   not used for sc
4ae0: 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  hema */..  asser
4af0: 74 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54  t( !pTable || pT
4b00: 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  able->nRef>0 );.
4b10: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
4b20: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
4b30: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
4b40: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
4b50: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21  zero. */.  if( !
4b60: 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  pTable ) return;
4b70: 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20  .  if( ((!db || 
4b80: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4b90: 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c  ==0) && (--pTabl
4ba0: 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65  e->nRef)>0) ) re
4bb0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f  turn;..  /* Reco
4bc0: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
4bd0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f   outstanding loo
4be0: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f  kaside allocatio
4bf0: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62  ns in schema Tab
4c00: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  les.  ** prior t
4c10: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65  o doing any free
4c20: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  () operations.  
4c30: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62  Since schema Tab
4c40: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20  les do not use. 
4c50: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74   ** lookaside, t
4c60: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  his number shoul
4c70: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  d not change. */
4c80: 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f  .  TESTONLY( nLo
4c90: 6f 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26  okaside = (db &&
4ca0: 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61   (pTable->tabFla
4cb0: 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
4cc0: 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  l)==0) ?.       
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4cf0: 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f  nOut : 0 );..  /
4d00: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
4d10: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
4d20: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
4d30: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
4d40: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
4d50: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
4d60: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
4d70: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
4d80: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
4d90: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4da0: 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  ==pTable->pSchem
4db0: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  a );.    if( !db
4dc0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
4dd0: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  reed==0 ){.     
4de0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4df0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4e00: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4e10: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4e20: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4e30: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4e40: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4e50: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4e60: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4e70: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4e80: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4e90: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4ea0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4eb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4ec0: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4ed0: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4ee0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4ef0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4f00: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4f10: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4f20: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4f30: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4f40: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4f50: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4f60: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4f70: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4f80: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
4f90: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4fa0: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
4fb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4fc0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
4fd0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4fe0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
4ff0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
5000: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
5010: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
5020: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
5030: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
5040: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5050: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
5060: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69  ->pCheck);.#endi
5070: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
5080: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
5090: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
50a0: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
50b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
50c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
50d0: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  able);..  /* Ver
50e0: 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b  ify that no look
50f0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73  aside memory was
5100: 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20   used by schema 
5110: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65  tables */.  asse
5120: 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d  rt( nLookaside==
5130: 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  0 || nLookaside=
5140: 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e  =db->lookaside.n
5150: 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Out );.}../*.** 
5160: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
5170: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
5180: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
5190: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
51a0: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
51b0: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
51c0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
51d0: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
51e0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
51f0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
5200: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
5210: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
5220: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
5230: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
5240: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
5250: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
5260: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
5270: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
5280: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
5290: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
52a0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
52b0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
52c0: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
52d0: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
52e0: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
52f0: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
5300: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
5310: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
5320: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
5330: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
5340: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
5350: 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  abName, 0);.  sq
5360: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
5370: 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66  (db, p);.  db->f
5380: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
5390: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
53a0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74  ./*.** Given a t
53b0: 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73  oken, return a s
53c0: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69  tring that consi
53d0: 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20  sts of the text 
53e0: 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e  of that.** token
53f0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
5400: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
5410: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
5420: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
5430: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
5440: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
5450: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
5460: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  tion..**.** Any 
5470: 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20  quotation marks 
5480: 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e  (ex:  "name", 'n
5490: 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72  ame', [name], or
54a0: 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a   `name`) that.**
54b0: 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f   surround the bo
54c0: 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  dy of the token 
54d0: 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a  are removed..**.
54e0: 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66  ** Tokens are of
54f0: 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72  ten just pointer
5500: 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  s into the origi
5510: 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64  nal SQL text and
5520: 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c   so.** are not \
5530: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
5540: 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69  nd are not persi
5550: 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75  stent.  The retu
5560: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5570: 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  s \000 terminate
5580: 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74  d and is persist
5590: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ent..*/.char *sq
55a0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
55b0: 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  en(sqlite3 *db, 
55c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
55d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
55e0: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
55f0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
5600: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
5610: 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70  har*)pName->z, p
5620: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71  Name->n);.    sq
5630: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
5640: 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
5650: 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d    zName = 0;.  }
5660: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
5670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
5680: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
5690: 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e   table stored in
56a0: 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
56b0: 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74   iDb for.** writ
56c0: 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69  ing. The table i
56d0: 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63  s opened using c
56e0: 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ursor 0..*/.void
56f0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
5700: 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  erTable(Parse *p
5710: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
5720: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
5730: 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c  etVdbe(p);.  sql
5740: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ite3TableLock(p,
5750: 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f   iDb, MASTER_ROO
5760: 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42  T, 1, SCHEMA_TAB
5770: 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69  LE(iDb));.  sqli
5780: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5790: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
57a0: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
57b0: 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28  , iDb, 5);.  if(
57c0: 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20   p->nTab==0 ){. 
57d0: 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a     p->nTab = 1;.
57e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72    }.}../*.** Par
57f0: 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69  ameter zName poi
5800: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72  nts to a nul-ter
5810: 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63  minated buffer c
5820: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
5830: 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62  me.** of a datab
5840: 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ase ("main", "te
5850: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
5860: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
5870: 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  b). This.** func
5880: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
5890: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
58a0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
58b0: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a  db->aDb[], or.**
58c0: 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64   -1 if the named
58d0: 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f   db cannot be fo
58e0: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
58f0: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71  te3FindDbName(sq
5900: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
5910: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
5920: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20   int i = -1;    
5930: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5940: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28   number */.  if(
5950: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62   zName ){.    Db
5960: 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e   *pDb;.    int n
5970: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
5980: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  30(zName);.    f
5990: 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29  or(i=(db->nDb-1)
59a0: 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69  , pDb=&db->aDb[i
59b0: 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44  ]; i>=0; i--, pD
59c0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b--){.      if( 
59d0: 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c  (!OMIT_TEMPDB ||
59e0: 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71   i!=1 ) && n==sq
59f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
5a00: 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20  b->zName) && .  
5a10: 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74          0==sqlit
5a20: 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a  e3StrICmp(pDb->z
5a30: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  Name, zName) ){.
5a40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5a50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5a60: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
5a70: 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20  /*.** The token 
5a80: 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  *pName contains 
5a90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
5aa0: 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22  tabase (either "
5ab0: 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d  main" or.** "tem
5ac0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
5ad0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
5ae0: 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ). This routine 
5af0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69  returns the.** i
5b00: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5b10: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5b20: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69  ->aDb[], or -1 i
5b30: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a  f the named db .
5b40: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ** does not exis
5b50: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5b60: 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20  3FindDb(sqlite3 
5b70: 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  *db, Token *pNam
5b80: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5bb0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
5bc0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
5bf0: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
5c00: 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20   for */.  zName 
5c10: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
5c20: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
5c30: 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33  );.  i = sqlite3
5c40: 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
5c50: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
5c60: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
5c70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
5c80: 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  ../* The table o
5c90: 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  r view or trigge
5ca0: 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64  r name is passed
5cb0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
5cc0: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70   via tokens.** p
5cd0: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
5ce0: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
5cf0: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
5d00: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
5d10: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  mple:.**.** CREA
5d20: 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79  TE TABLE xxx.yyy
5d30: 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54   (...);.** .** T
5d40: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5d50: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
5d60: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
5d70: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
5d80: 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e  f.** the table n
5d90: 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79  ame is not fully
5da0: 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e   qualified, i.e.
5db0: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
5dc0: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a  ABLE yyy(...);.*
5dd0: 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31  *.** Then pName1
5de0: 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22   is set to "yyy"
5df0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22   and pName2 is "
5e00: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
5e10: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a  utine sets the *
5e20: 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72  ppUnqual pointer
5e30: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
5e40: 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f   token (pName1 o
5e50: 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61  r.** pName2) tha
5e60: 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71  t stores the unq
5e70: 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e  ualified table n
5e80: 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20  ame.  The index 
5e90: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
5ea0: 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75  se "xxx" is retu
5eb0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
5ec0: 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
5ed0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5ee0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
5ef0: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5f00: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5f10: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
5f20: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78  ,      /* The "x
5f30: 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  xx" in the name 
5f40: 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78  "xxx.yyy" or "xx
5f50: 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  x" */.  Token *p
5f60: 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54  Name2,      /* T
5f70: 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20  he "yyy" in the 
5f80: 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a  name "xxx.yyy" *
5f90: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71  /.  Token **pUnq
5fa0: 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ual     /* Write
5fb0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
5fc0: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72   object name her
5fd0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44  e */.){.  int iD
5fe0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
5ff0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
6000: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62  e holding the ob
6010: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
6020: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6030: 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59  db;..  if( ALWAY
6040: 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26 20  S(pName2!=0) && 
6050: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
6060: 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
6070: 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73  busy ) {.      s
6080: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6090: 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
60a0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
60b0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
60c0: 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20   }.    *pUnqual 
60d0: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
60e0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
60f0: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
6100: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
6110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6120: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
6130: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
6140: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
6150: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
6160: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6170: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
6180: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
6190: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
61a0: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
61b0: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
61c0: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
61d0: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
61e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
61f0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
6200: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
6210: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
6220: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
6230: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
6240: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
6250: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
6260: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
6270: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
6280: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
6290: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
62a0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
62b0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
62c0: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
62d0: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
62e0: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
62f0: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
6300: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
6310: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
6320: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
6330: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6340: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
6350: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6360: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
6370: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
6380: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
6390: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
63a0: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
63b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
63c0: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
63d0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
63e0: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
63f0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6400: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
6410: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6420: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
6430: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
6440: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
6450: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
6460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
6470: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
6480: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
6490: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
64a0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
64b0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
64c0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
64d0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
64e0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
64f0: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
6500: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
6510: 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  & !IsPrimaryKeyI
6520: 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e  ndex(p); p=p->pN
6530: 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ext){}.  return 
6540: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6550: 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  rn the column of
6560: 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74   index pIdx that
6570: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
6580: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  table.** column 
6590: 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31  iCol.  Return -1
65a0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
65b0: 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c  /.i16 sqlite3Col
65c0: 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78  umnOfIndex(Index
65d0: 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c   *pIdx, i16 iCol
65e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
65f0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
6600: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6610: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
6620: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20  ->aiColumn[i] ) 
6630: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
6640: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
6650: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
6660: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
6670: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
6680: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
6690: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
66a0: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
66b0: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
66c0: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
66d0: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
66e0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
66f0: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
6700: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
6710: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6720: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
6730: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
6740: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
6750: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
6760: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
6770: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
6780: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
6790: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
67a0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
67b0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
67c0: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
67d0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
67e0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
67f0: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
6800: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
6810: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
6820: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
6830: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
6840: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
6850: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
6860: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
6870: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
6880: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
6890: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
68a0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
68b0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
68c0: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
68d0: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
68e0: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
68f0: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
6900: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6910: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6920: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6930: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6940: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6950: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6960: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
6970: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
6980: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
6990: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
69a0: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
69b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
69c0: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
69d0: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
69e0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
69f0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
6a00: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6a10: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6a20: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6a30: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6a40: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6a50: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
6a60: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6a70: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
6a80: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
6a90: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6aa0: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
6ab0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
6ac0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6ad0: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
6ae0: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
6af0: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
6b00: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
6b10: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6b20: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
6b30: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
6b40: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
6b50: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
6b60: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
6b70: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
6b80: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6b90: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
6ba0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6bb0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
6bc0: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
6bd0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
6be0: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
6bf0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
6c00: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6c10: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
6c20: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
6c30: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
6c40: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74  e */..  /* The t
6c50: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
6c60: 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20 70  e to create is p
6c70: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f  assed to this ro
6c80: 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73  utine via tokens
6c90: 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  .  ** pName1 and
6ca0: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
6cb0: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
6cc0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
6cd0: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  for example:.  *
6ce0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
6cf0: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
6d00: 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68  );.  ** .  ** Th
6d10: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
6d20: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
6d30: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
6d40: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
6d50: 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
6d60: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
6d70: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
6d80: 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  .:.  **.  ** CRE
6d90: 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e  ATE TABLE yyy(..
6da0: 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .);.  **.  ** Th
6db0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
6dc0: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
6dd0: 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a  ame2 is ""..  **
6de0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62  .  ** The call b
6df0: 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e  elow sets the pN
6e00: 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ame pointer to p
6e10: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
6e20: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a  n (pName1 or.  *
6e30: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
6e40: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
6e50: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
6e60: 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 69  . The variable i
6e70: 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74  Db is.  ** set t
6e80: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
6e90: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
6ea0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6eb0: 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a  ew is to be.  **
6ec0: 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a   created in..  *
6ed0: 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  /.  iDb = sqlite
6ee0: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
6ef0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
6f00: 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
6f10: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
6f20: 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f  rn;.  if( !OMIT_
6f30: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6f40: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
6f50: 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  && iDb!=1 ){.   
6f60: 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20   /* If creating 
6f70: 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68  a temp table, th
6f80: 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62  e name may not b
6f90: 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c  e qualified. Unl
6fa0: 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ess .    ** the 
6fb0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
6fc0: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
6fd0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
6fe0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6ff0: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
7000: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
7010: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
7020: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7030: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7040: 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62 20  && isTemp ) iDb 
7050: 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  = 1;..  pParse->
7060: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
7070: 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  ame;.  zName = s
7080: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
7090: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
70a0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
70b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53   return;.  if( S
70c0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
70d0: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
70e0: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
70f0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  ){.    goto begi
7100: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7110: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69   }.  if( db->ini
7120: 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d  t.iDb==1 ) isTem
7130: 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  p = 1;.#ifndef S
7140: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
7150: 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72  RIZATION.  asser
7160: 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d  t( (isTemp & 1)=
7170: 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20  =isTemp );.  {. 
7180: 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
7190: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
71a0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
71b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
71c0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
71d0: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
71e0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
71f0: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
7200: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
7210: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7220: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
7230: 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  View ){.      if
7240: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
7250: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
7260: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
7270: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
7280: 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EW;.      }else{
7290: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
72a0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
72b0: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EW;.      }.    
72c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
72d0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
72e0: 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20   isTemp ){.     
72f0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
7300: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42  _CREATE_TEMP_TAB
7310: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
7320: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
7330: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41  SQLITE_CREATE_TA
7340: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
7350: 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 69   }.    if( !isVi
7360: 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33  rtual && sqlite3
7370: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
7380: 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30  , code, zName, 0
7390: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
73a0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
73b0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
73c0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
73d0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
73e0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
73f0: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
7400: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
7410: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
7420: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
7430: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
7440: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
7450: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
7460: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
7470: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
7480: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
7490: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
74a0: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
74b0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
74c0: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
74d0: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
74e0: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
74f0: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
7500: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
7510: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
7520: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
7530: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
7540: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
7550: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
7560: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  {.    char *zDb 
7570: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
7580: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51  Name;.    if( SQ
7590: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
75a0: 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
75b0: 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
75c0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
75d0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  or;.    }.    pT
75e0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69  able = sqlite3Fi
75f0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
7600: 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  e, zDb);.    if(
7610: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
7620: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
7630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7640: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7650: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
7660: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
7670: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7680: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
7690: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
76a0: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
76b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
76c0: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
76d0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
76e0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
76f0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7700: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7710: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
7720: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  x(db, zName, zDb
7730: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
7740: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7750: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
7760: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
7770: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
7780: 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  e);.      goto b
7790: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
77a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
77b0: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Table = sqlite3D
77c0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
77d0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
77e0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
77f0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
7800: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
7810: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
7820: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7830: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
7840: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7850: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
7860: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
7870: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
7880: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
7890: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
78a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
78b0: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
78c0: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  e->nRef = 1;.  p
78d0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
78e0: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
78f0: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
7900: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
7910: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
7920: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
7930: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
7940: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
7950: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
7960: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
7970: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
7980: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
7990: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
79a0: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
79b0: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
79c0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
79d0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
79e0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
79f0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
7a00: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
7a10: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7a20: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
7a30: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
7a40: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
7a50: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
7a60: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
7a70: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7a80: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
7a90: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
7aa0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
7ab0: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
7ac0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
7ad0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7ae0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
7af0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
7b00: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
7b10: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
7b20: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
7b30: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
7b40: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
7b50: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
7b60: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
7b70: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
7b80: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
7b90: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
7ba0: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
7bb0: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
7bc0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
7bd0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
7be0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
7bf0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
7c00: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
7c10: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
7c20: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
7c30: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
7c40: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
7c50: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
7c60: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7c70: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
7c80: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
7c90: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
7ca0: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
7cb0: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
7cc0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
7cd0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
7ce0: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
7cf0: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
7d00: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
7d10: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
7d20: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
7d30: 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
7d40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d50: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7d60: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
7d70: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
7d80: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7d90: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
7da0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
7db0: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
7dc0: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
7dd0: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
7de0: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
7df0: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
7e00: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
7e10: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
7e20: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
7e30: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7e40: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
7e50: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
7e60: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7e70: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
7e80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
7e90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ea0: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
7eb0: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
7ec0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
7ed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
7ee0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
7ef0: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
7f00: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
7f10: 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62  P_If, reg3); Vdb
7f20: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7f30: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
7f40: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
7f50: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
7f60: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
7f70: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
7f80: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
7f90: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
7fa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7fb0: 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f  _Integer, fileFo
7fc0: 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20  rmat, reg3);.   
7fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7fe0: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7ff0: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46  ie, iDb, BTREE_F
8000: 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33  ILE_FORMAT, reg3
8010: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8020: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8030: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
8040: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
8050: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8060: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
8070: 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45  Db, BTREE_TEXT_E
8080: 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a  NCODING, reg3);.
8090: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
80a0: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
80b0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73  .    /* This jus
80c0: 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63  t creates a plac
80d0: 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20  e-holder record 
80e0: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
80f0: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  ster table..    
8100: 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72  ** The record cr
8110: 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63  eated does not c
8120: 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20  ontain anything 
8130: 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  yet.  It will be
8140: 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a   replaced.    **
8150: 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74   by the real ent
8160: 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72  ry in code gener
8170: 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45  ated at sqlite3E
8180: 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a  ndTable()..    *
8190: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  *.    ** The row
81a0: 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  id for the new e
81b0: 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20  ntry is left in 
81c0: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
81d0: 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a  >regRowid..    *
81e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
81f0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
8200: 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20  w table is left 
8210: 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72  in reg pParse->r
8220: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54  egRoot..    ** T
8230: 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f  he rowid and roo
8240: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61  t page number va
8250: 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20  lues are needed 
8260: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
8270: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
8280: 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e  ndTable will gen
8290: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
82a0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
82b0: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
82c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
82d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
82e0: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
82f0: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
8300: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8310: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8320: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32  Integer, 0, reg2
8330: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
8340: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
8350: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
8360: 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  b = sqlite3VdbeA
8370: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
8380: 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65  teTable, iDb, re
8390: 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g2);.    }.    s
83a0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
83b0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
83c0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
83d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
83e0: 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  NewRowid, 0, reg
83f0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8400: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8410: 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a  Null, 0, reg3);.
8420: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8430: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
8440: 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67  rt, 0, reg3, reg
8450: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8460: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
8470: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
8480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8490: 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp0(v, OP_Close
84a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
84b0: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
84c0: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
84d0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
84e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
84f0: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
8500: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
8510: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
8520: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
8530: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
8540: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75   This macro is u
8550: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  sed to compare t
8560: 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  wo strings in a 
8570: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
8580: 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69   manner..** It i
8590: 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65  s slightly faste
85a0: 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73  r than calling s
85b0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20  qlite3StrICmp() 
85c0: 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a  directly, but.**
85d0: 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72   produces larger
85e0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52   code..**.** WAR
85f0: 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f  NING: This macro
8600: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62   is not compatib
8610: 6c 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63  le with the strc
8620: 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a  mp() family. It.
8630: 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  ** returns true 
8640: 69 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e  if the two strin
8650: 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74  gs are equal, ot
8660: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8670: 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d  /.#define STRICM
8680: 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74  P(x, y) (\.sqlit
8690: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
86a0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
86b0: 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69  )(x)]==   \.sqli
86c0: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
86d0: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  *(unsigned char 
86e0: 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20  *)(y)]     \.&& 
86f0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28  sqlite3StrICmp((
8700: 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29  x)+1,(y)+1)==0 )
8710: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8720: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
8730: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
8740: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
8750: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
8760: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
8770: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
8780: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
8790: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
87a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
87b0: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33  tement.  sqlite3
87c0: 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74  StartTable() get
87d0: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73  s called.** firs
87e0: 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20  t to get things 
87f0: 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69  going.  Then thi
8800: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8810: 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  led for each.** 
8820: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
8830: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
8840: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8850: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
8860: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8870: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8880: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
8890: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
88a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
88b0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
88c0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
88d0: 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45  turn;.#if SQLITE
88e0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
88f0: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
8900: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8910: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
8920: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8930: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
8940: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
8950: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
8960: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8970: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c  #endif.  z = sql
8980: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
8990: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
89a0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
89b0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
89c0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
89d0: 20 20 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a     if( STRICMP(z
89e0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
89f0: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
8a00: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8a10: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
8a20: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
8a30: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
8a40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
8a50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
8a60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
8a70: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
8a80: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
8a90: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
8aa0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
8ab0: 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  loc(db,p->aCol,(
8ac0: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
8ad0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8ae0: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
8af0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8b00: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
8b10: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8b20: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
8b30: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
8b40: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
8b50: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
8b60: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
8b70: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
8b80: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
8b90: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
8ba0: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
8bb0: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
8bc0: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
8bd0: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 42  affinity.  ** 'B
8be0: 4c 4f 42 27 2e 20 49 66 20 74 68 65 72 65 20 69  LOB'. If there i
8bf0: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
8c00: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
8c10: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
8c20: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
8c30: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
8c40: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
8c50: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
8c60: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8c70: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
8c80: 42 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  B;.  pCol->szEst
8c90: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b   = 1;.  p->nCol+
8ca0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
8cb0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8cc0: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8cd0: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
8ce0: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
8cf0: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
8d00: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
8d10: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
8d20: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
8d30: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
8d40: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
8d50: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
8d60: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
8d70: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
8d80: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8d90: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
8da0: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
8db0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8dc0: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
8dd0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20  Table *p;.  p = 
8de0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8df0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
8e00: 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31   NEVER(p->nCol<1
8e10: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d  ) ) return;.  p-
8e20: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
8e30: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  .notNull = (u8)o
8e40: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
8e50: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
8e60: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
8e70: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
8e80: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
8e90: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
8ea0: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
8eb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
8ec0: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
8ed0: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
8ee0: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
8ef0: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
8f00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
8f10: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
8f20: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
8f30: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
8f40: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
8f50: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
8f60: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
8f70: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
8f80: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
8f90: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
8fa0: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
8fb0: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
8fc0: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
8fd0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
8fe0: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
8ff0: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
9000: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
9010: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
9020: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
9030: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
9040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
9060: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
9070: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9080: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
9090: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
90a0: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
90b0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
90c0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
90d0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
90e0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
90f0: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
9100: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a  LITE_AFF_BLOB.**
9110: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
9120: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9130: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
9140: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
9150: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
9160: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9170: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
9180: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
9190: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
91a0: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
91b0: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
91c0: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
91d0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
91e0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
91f0: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
9200: 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74 29  zIn, u8 *pszEst)
9210: 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20  {.  u32 h = 0;. 
9220: 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49   char aff = SQLI
9230: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
9240: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
9250: 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  har = 0;..  if( 
9260: 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  zIn==0 ) return 
9270: 61 66 66 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  aff;.  while( zI
9280: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
9290: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
92a0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
92b0: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
92c0: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
92d0: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
92e0: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
92f0: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9300: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9310: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9320: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9330: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9340: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9350: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
9360: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
9370: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
9380: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
9390: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
93a0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
93b0: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
93c0: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
93d0: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
93e0: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
93f0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9400: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9410: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9420: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9430: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9440: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
9450: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
9460: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9470: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
9480: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
9490: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
94a0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
94b0: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
94c0: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
94d0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
94e0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
94f0: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9500: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9510: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9520: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9530: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9540: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9550: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9560: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9570: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9580: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9590: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
95a0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
95b0: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
95c0: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
95d0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
95e0: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
95f0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9600: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9610: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9620: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9630: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9640: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9650: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9660: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9670: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9680: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9690: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
96a0: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
96b0: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
96c0: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
96d0: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
96e0: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
96f0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9700: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9720: 20 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f   If pszEst is no
9730: 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e  t NULL, store an
9740: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
9750: 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68   field size.  Th
9760: 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20  e.  ** estimate 
9770: 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61  is scaled so tha
9780: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  t the size of an
9790: 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20   integer is 1.  
97a0: 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20  */.  if( pszEst 
97b0: 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d  ){.    *pszEst =
97c0: 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74   1;   /* default
97d0: 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20   size is approx 
97e0: 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  4 bytes */.    i
97f0: 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46  f( aff<SQLITE_AF
9800: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9810: 20 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a     if( zChar ){.
9820: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
9830: 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  Char[0] ){.     
9840: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9850: 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d  Isdigit(zChar[0]
9860: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
9870: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20   int v = 0;.    
9880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
9890: 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26  etInt32(zChar, &
98a0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
98b0: 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20  v = v/4 + 1;.   
98c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e 32           if( v>2
98d0: 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20  55 ) v = 255;.  
98e0: 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73            *pszEs
98f0: 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b  t = v; /* BLOB(k
9900: 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43  ), VARCHAR(k), C
9910: 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34  HAR(k) -> r=(k/4
9920: 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  +1) */.         
9930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9940: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9950: 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20  zChar++;.       
9960: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
9970: 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20          *pszEst 
9980: 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20  = 5;   /* BLOB, 
9990: 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d  TEXT, CLOB -> r=
99a0: 35 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79  5  (approx 20 by
99b0: 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  tes)*/.      }. 
99c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
99d0: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
99e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
99f0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
9a00: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
9a10: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
9a20: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
9a30: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
9a40: 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b    The pFirst tok
9a50: 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 0a  en is the first.
9a60: 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ** token in the 
9a70: 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65  sequence of toke
9a80: 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ns that describe
9a90: 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
9aa0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  .** column curre
9ab0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9ac0: 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74  ruction.   pLast
9ad0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b   is the last tok
9ae0: 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71  en.** in the seq
9af0: 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73  uence.  Use this
9b00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
9b10: 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72 69  construct a stri
9b20: 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61  ng.** that conta
9b30: 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65  ins the typename
9b40: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
9b50: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73 74  nd store that st
9b60: 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65  ring.** in zType
9b70: 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
9b80: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
9b90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
9ba0: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
9bb0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
9bc0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d  mn *pCol;..  p =
9bd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9be0: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
9bf0: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
9c00: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
9c10: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
9c20: 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73  ->nCol-1];.  ass
9c30: 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  ert( pCol->zType
9c40: 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ==0 || CORRUPT_D
9c50: 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  B );.  sqlite3Db
9c60: 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
9c70: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20   pCol->zType);. 
9c80: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
9c90: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
9ca0: 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
9cb0: 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  pType);.  pCol->
9cc0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
9cd0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
9ce0: 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43 6f  Col->zType, &pCo
9cf0: 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a  l->szEst);.}../*
9d00: 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69  .** The expressi
9d10: 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  on is the defaul
9d20: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
9d30: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9d40: 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66  ded column.** of
9d50: 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
9d60: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
9d70: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44  ruction..**.** D
9d80: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70  efault value exp
9d90: 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65  ressions must be
9da0: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73   constant.  Rais
9db0: 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69  e an exception i
9dc0: 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74  f this.** is not
9dd0: 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a   the case..**.**
9de0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9df0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
9e00: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
9e10: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
9e20: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
9e30: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
9e40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9e50: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
9e60: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
9e70: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 29  ExprSpan *pSpan)
9e80: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
9e90: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
9ea0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9eb0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20  arse->db;.  p = 
9ec0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9ed0: 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b  e;.  if( p!=0 ){
9ee0: 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d  .    pCol = &(p-
9ef0: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
9f00: 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  );.    if( !sqli
9f10: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9f20: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70 61  tOrFunction(pSpa
9f30: 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e  n->pExpr, db->in
9f40: 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20  it.busy) ){.    
9f50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9f60: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
9f70: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
9f80: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
9f90: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
9fa0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
9fb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9fc0: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
9fd0: 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e  pExpr is used in
9fe0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69  stead of the ori
9ff0: 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20  ginal, as pExpr 
a000: 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
a010: 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f  * tokens that po
a020: 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20  int to volatile 
a030: 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61  memory. The 'spa
a040: 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  n' of the expres
a050: 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  sion.      ** is
a060: 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72 61   required by pra
a070: 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a  gma table_info..
a080: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
a090: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
a0a0: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
a0b0: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70  );.      pCol->p
a0c0: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Dflt = sqlite3Ex
a0d0: 70 72 44 75 70 28 64 62 2c 20 70 53 70 61 6e 2d  prDup(db, pSpan-
a0e0: 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55 50 5f  >pExpr, EXPRDUP_
a0f0: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73  REDUCE);.      s
a100: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a110: 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20   pCol->zDflt);. 
a120: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74       pCol->zDflt
a130: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
a140: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
a150: 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20  Span->zStart,.  
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
a190: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
a1a0: 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  tart));.    }.  
a1b0: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
a1c0: 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d  elete(db, pSpan-
a1d0: 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pExpr);.}../*.*
a1e0: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20  * Designate the 
a1f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20  PRIMARY KEY for 
a200: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73  the table.  pLis
a210: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
a220: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75  ames .** of colu
a230: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68  mns that form th
a240: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20  e primary key.  
a250: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c  If pList is NULL
a260: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f  , then the.** mo
a270: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
a280: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  d column of the 
a290: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69  table is the pri
a2a0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  mary key..**.** 
a2b0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65  A table can have
a2c0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69   at most one pri
a2d0: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68  mary key.  If th
a2e0: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  e table already 
a2f0: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79  has.** a primary
a300: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69   key (and this i
a310: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69  s the second pri
a320: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63  mary key) then c
a330: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  reate an.** erro
a340: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
a350: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f  PRIMARY KEY is o
a360: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  n a single colum
a370: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65  n whose datatype
a380: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20   is INTEGER,.** 
a390: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79  then we will try
a3a0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c   to use that col
a3b0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64  umn as the rowid
a3c0: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65  .  Set the Table
a3d0: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20  .iPKey.** field 
a3e0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  of the table und
a3f0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
a400: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20  to be the index 
a410: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  of the.** INTEGE
a420: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  R PRIMARY KEY co
a430: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b  lumn.  Table.iPK
a440: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ey is set to -1 
a450: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  if there is.** n
a460: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  o INTEGER PRIMAR
a470: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Y KEY..**.** If 
a480: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61  the key is not a
a490: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
a4a0: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61  Y KEY, then crea
a4b0: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69  te a unique.** i
a4c0: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
a4d0: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63  .  No index is c
a4e0: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47  reated for INTEG
a4f0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  ER PRIMARY KEYs.
a500: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a510: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20  AddPrimaryKey(. 
a520: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a530: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
a540: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
a550: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20  ist *pList,  /* 
a560: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61  List of field na
a570: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mes to be indexe
a580: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
a590: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74  or,      /* What
a5a0: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e   to do with a un
a5b0: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63  iqueness conflic
a5c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49  t */.  int autoI
a5d0: 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nc,      /* True
a5e0: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52   if the AUTOINCR
a5f0: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73  EMENT keyword is
a600: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
a610: 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20  t sortOrder     
a620: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  /* SQLITE_SO_ASC
a630: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45   or SQLITE_SO_DE
a640: 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  SC */.){.  Table
a650: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
a660: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68  >pNewTable;.  ch
a670: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  ar *zType = 0;. 
a680: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20   int iCol = -1, 
a690: 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  i;.  int nTerm;.
a6a0: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c    if( pTab==0 ||
a6b0: 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
a6c0: 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f   ) goto primary_
a6d0: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20  key_exit;.  if( 
a6e0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
a6f0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
a700: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
a710: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a720: 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c   .      "table \
a730: 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74  "%s\" has more t
a740: 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  han one primary 
a750: 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  key", pTab->zNam
a760: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69  e);.    goto pri
a770: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
a780: 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c   }.  pTab->tabFl
a790: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69  ags |= TF_HasPri
a7a0: 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70  maryKey;.  if( p
a7b0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  List==0 ){.    i
a7c0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
a7d0: 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   - 1;.    pTab->
a7e0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c  aCol[iCol].colFl
a7f0: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50  ags |= COLFLAG_P
a800: 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a 54 79 70  RIMKEY;.    zTyp
a810: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
a820: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
a830: 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  nTerm = 1;.  }el
a840: 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  se{.    nTerm = 
a850: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
a860: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
a870: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
a880: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
a890: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
a8a0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l++){.        if
a8b0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
a8c0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
a8d0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
a8e0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
a8f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
a900: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c  ->aCol[iCol].col
a910: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a920: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
a930: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
a940: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
a950: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  pe;.          br
a960: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a970: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a980: 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a  .  if( nTerm==1.
a990: 20 20 20 26 26 20 7a 54 79 70 65 20 26 26 20 73     && zType && s
a9a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
a9b0: 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d  ype, "INTEGER")=
a9c0: 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64  =0.   && sortOrd
a9d0: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
a9e0: 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  C.  ){.    pTab-
a9f0: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
aa00: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
aa10: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
aa20: 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f      assert( auto
aa30: 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e  Inc==0 || autoIn
aa40: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
aa50: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75  ->tabFlags |= au
aa60: 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63  toInc*TF_Autoinc
aa70: 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20  rement;.    if( 
aa80: 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e  pList ) pParse->
aa90: 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  iPkSortOrder = p
aaa0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
aab0: 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rder;.  }else if
aac0: 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66  ( autoInc ){.#if
aad0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
aae0: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
aaf0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
ab00: 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f  sg(pParse, "AUTO
ab10: 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c  INCREMENT is onl
ab20: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20  y allowed on an 
ab30: 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45  ".       "INTEGE
ab40: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b  R PRIMARY KEY");
ab50: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
ab60: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
ab70: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72     p = sqlite3Cr
ab80: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
ab90: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
aba0: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20  , onError, 0,.  
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abc0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74           0, sort
abd0: 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69  Order, 0);.    i
abe0: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
abf0: 3e 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54  >idxType = SQLIT
ac00: 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
ac10: 59 4b 45 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  YKEY;.    }.    
ac20: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
ac30: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
ac40: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
ac50: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
ac60: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
ac70: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
ac80: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
ac90: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
aca0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
acb0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
acc0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
acd0: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
ace0: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
acf0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
ad00: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
ad10: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
ad20: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
ad30: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
ad40: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
ad50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
ad60: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
ad70: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ad80: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
ad90: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ada0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
adb0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
adc0: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
add0: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
ade0: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
adf0: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
ae00: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
ae10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
ae20: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
ae30: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
ae40: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
ae50: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
ae60: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
ae70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
ae80: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
ae90: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
aea0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
aeb0: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
aec0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
aed0: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
aee0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
aef0: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
af00: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
af10: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
af20: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
af30: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
af40: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
af50: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
af60: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
af70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
af80: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
af90: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
afa0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
afb0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
afc0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
afe0: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
aff0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b000: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
b010: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
b020: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b030: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
b040: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
b050: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
b060: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
b070: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
b080: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
b090: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
b0a0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
b0b0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b0c0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
b0d0: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
b0e0: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
b0f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
b100: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
b110: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
b120: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
b130: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
b140: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
b150: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
b160: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
b170: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
b180: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
b190: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
b1a0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
b1b0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
b1c0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
b1d0: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
b1e0: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
b1f0: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
b200: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
b210: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
b220: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
b230: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
b240: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
b250: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
b260: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
b270: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
b280: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
b290: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
b2a0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
b2b0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
b2c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
b2d0: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
b2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
b2f0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
b300: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
b310: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
b320: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
b330: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
b340: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
b350: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
b360: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
b370: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
b380: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b390: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
b3a0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
b3b0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
b3c0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
b3d0: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
b3e0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b3f0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
b400: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
b410: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b420: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
b430: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
b440: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
b450: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
b460: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
b470: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
b480: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
b490: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
b4a0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
b4b0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
b4c0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
b4d0: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
b4e0: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
b4f0: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
b500: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
b510: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
b520: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
b530: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
b540: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
b550: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
b560: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
b570: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
b580: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
b590: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
b5a0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b5b0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
b5c0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
b5d0: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
b5e0: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
b5f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
b600: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
b610: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
b620: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
b630: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
b640: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
b650: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
b660: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
b670: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
b680: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b690: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
b6a0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
b6b0: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
b6c0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
b6d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
b6e0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
b6f0: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
b700: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
b710: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
b720: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
b730: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
b740: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
b750: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
b760: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
b770: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
b780: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
b790: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
b7a0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
b7b0: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
b7c0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
b7d0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
b7e0: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
b7f0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
b800: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
b810: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
b820: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
b830: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
b840: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
b850: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
b860: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
b870: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
b880: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
b890: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
b8a0: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
b8b0: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
b8c0: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
b8d0: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
b8e0: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
b8f0: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
b900: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
b910: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
b920: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
b930: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
b940: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
b950: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
b960: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
b970: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
b980: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
b990: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
b9a0: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
b9b0: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
b9c0: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
b9d0: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
b9e0: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
b9f0: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
ba00: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
ba10: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
ba20: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
ba30: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
ba40: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
ba50: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
ba60: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
ba70: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
ba80: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
ba90: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
baa0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
bab0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
bac0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
bad0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
bae0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
baf0: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
bb00: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
bb10: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
bb20: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
bb30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bb40: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
bb50: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
bb60: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
bb70: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
bb80: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
bb90: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
bba0: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
bbb0: 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71  RSION, r1);.  sq
bbc0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
bbd0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
bbe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
bbf0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
bc00: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
bc10: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
bc20: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
bc30: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
bc40: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
bc50: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
bc60: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
bc70: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
bc80: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
bc90: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
bca0: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
bcb0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
bcc0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
bcd0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
bce0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
bcf0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
bd00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
bd10: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
bd20: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
bd30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
bd40: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
bd50: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
bd60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
bd70: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
bd80: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
bd90: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
bda0: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
bdb0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
bdc0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
bdd0: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
bde0: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
bdf0: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
be00: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
be10: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
be20: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
be30: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
be40: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
be50: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
be60: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
be70: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
be80: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
be90: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
bea0: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
beb0: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
bec0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
bed0: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
bee0: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
bef0: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
bf00: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
bf10: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
bf20: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
bf30: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
bf40: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
bf50: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
bf60: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
bf70: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
bf80: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
bf90: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
bfa0: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
bfb0: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
bfc0: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
bfd0: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
bfe0: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
bff0: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
c000: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
c010: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
c020: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
c030: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
c040: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
c050: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
c060: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
c070: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
c080: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
c090: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
c0a0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
c0b0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
c0c0: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
c0d0: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
c0e0: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
c0f0: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
c100: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
c110: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
c120: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
c130: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
c140: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
c150: 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  _ID.            
c160: 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a  || zIdent[j]!=0.
c170: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a              || j
c180: 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  ==0;..  if( need
c190: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
c1a0: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
c1b0: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c1c0: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
c1d0: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
c1e0: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
c1f0: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c200: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
c210: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
c220: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
c230: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
c240: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c250: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
c260: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
c270: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
c280: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
c290: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
c2a0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
c2b0: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
c2c0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
c2d0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
c2e0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
c2f0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
c300: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
c310: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
c320: 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Stmt(sqlite3 *db
c330: 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  , Table *p){.  i
c340: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
c350: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
c360: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
c370: 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e   *zEnd;.  Column
c380: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
c390: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
c3a0: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
c3b0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
c3c0: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
c3d0: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
c3e0: 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a  zName) + 5;.  }.
c3f0: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
c400: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
c410: 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20  if( n<50 ){ .   
c420: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
c430: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
c440: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
c450: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
c460: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
c470: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
c480: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
c490: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
c4a0: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
c4b0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  mt = sqlite3DbMa
c4c0: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20  llocRaw(0, n);. 
c4d0: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b   if( zStmt==0 ){
c4e0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
c4f0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  ailed = 1;.    r
c500: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
c510: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c520: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
c530: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
c540: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c550: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
c560: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
c570: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
c580: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
c590: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
c5a0: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
c5b0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
c5c0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
c5d0: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
c5e0: 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  zType[] = {.    
c5f0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c600: 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c  F_BLOB    */ "",
c610: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c620: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a  TE_AFF_TEXT    *
c630: 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20  / " TEXT",.     
c640: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c650: 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55  _NUMERIC */ " NU
c660: 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  M",.        /* S
c670: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c680: 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20  R */ " INT",.   
c690: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c6a0: 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20  FF_REAL    */ " 
c6b0: 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20  REAL".    };.   
c6c0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
c6d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
c6e0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
c6f0: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
c700: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
c710: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
c720: 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d  rlen30(&zStmt[k]
c730: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
c740: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
c750: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
c760: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61  l->zName);.    a
c770: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c780: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
c790: 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20  _BLOB >= 0 );.  
c7a0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
c7b0: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
c7c0: 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79  AFF_BLOB < Array
c7d0: 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a  Size(azType) );.
c7e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
c7f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c800: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
c810: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c820: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c830: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
c840: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c850: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c860: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c870: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
c880: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c890: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
c8a0: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
c8b0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c8c0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c8d0: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
c8e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
c8f0: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
c900: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y - SQLITE_AFF_B
c910: 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  LOB];.    len = 
c920: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c930: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
c940: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
c950: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ty==SQLITE_AFF_B
c960: 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20  LOB .           
c970: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
c980: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
c990: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30  ityType(zType, 0
c9a0: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
c9b0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
c9c0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
c9d0: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
c9e0: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
c9f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ca00: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
ca10: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
ca20: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
ca30: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e  ./*.** Resize an
ca40: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
ca50: 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20   hold N columns 
ca60: 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53  total.  Return S
ca70: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
ca80: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
ca90: 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f  E_NOMEM on an OO
caa0: 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  M error..*/.stat
cab0: 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64  ic int resizeInd
cac0: 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  exObject(sqlite3
cad0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
cae0: 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61  x, int N){.  cha
caf0: 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74  r *zExtra;.  int
cb00: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49   nByte;.  if( pI
cb10: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29  dx->nColumn>=N )
cb20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cb30: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  K;.  assert( pId
cb40: 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20  x->isResized==0 
cb50: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69  );.  nByte = (si
cb60: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
cb70: 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e  zeof(i16) + 1)*N
cb80: 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c  ;.  zExtra = sql
cb90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
cba0: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  (db, nByte);.  i
cbb0: 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72  f( zExtra==0 ) r
cbc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cbd0: 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  EM;.  memcpy(zEx
cbe0: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
cbf0: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
cc00: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
cc10: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
cc20: 3d 20 28 63 68 61 72 2a 2a 29 7a 45 78 74 72 61  = (char**)zExtra
cc30: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
cc40: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20  zeof(char*)*N;. 
cc50: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
cc60: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
cc70: 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78  sizeof(i16)*pIdx
cc80: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
cc90: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
cca0: 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  i16*)zExtra;.  z
ccb0: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
ccc0: 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  i16)*N;.  memcpy
ccd0: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
cce0: 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d  SortOrder, pIdx-
ccf0: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
cd00: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
cd10: 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70  (u8*)zExtra;.  p
cd20: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e  Idx->nColumn = N
cd30: 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69  ;.  pIdx->isResi
cd40: 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  zed = 1;.  retur
cd50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cd60: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
cd70: 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64  he total row wid
cd80: 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a  th for a table..
cd90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
cda0: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
cdb0: 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  h(Table *pTab){.
cdc0: 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c    unsigned wTabl
cdd0: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43  e = 0;.  const C
cde0: 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
cdf0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
ce00: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61  =pTab->nCol, pTa
ce10: 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
ce20: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43   i>0; i--, pTabC
ce30: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c  ol++){.    wTabl
ce40: 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a  e += pTabCol->sz
ce50: 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Est;.  }.  if( p
ce60: 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77  Tab->iPKey<0 ) w
ce70: 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d  Table++;.  pTab-
ce80: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
ce90: 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65  te3LogEst(wTable
cea0: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  *4);.}../*.** Es
ceb0: 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
cec0: 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ge size of a row
ced0: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
cee0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
cef0: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
cf00: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
cf10: 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78   unsigned wIndex
cf20: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
cf30: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61   const Column *a
cf40: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Col = pIdx->pTab
cf50: 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28  le->aCol;.  for(
cf60: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
cf70: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
cf80: 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  i16 x = pIdx->ai
cf90: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
cfa0: 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70  ssert( x<pIdx->p
cfb0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  Table->nCol );. 
cfc0: 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30     wIndex += x<0
cfd0: 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78   ? 1 : aCol[pIdx
cfe0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73  ->aiColumn[i]].s
cff0: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78  zEst;.  }.  pIdx
d000: 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c  ->szIdxRow = sql
d010: 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65  ite3LogEst(wInde
d020: 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  x*4);.}../* Retu
d030: 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65  rn true if value
d040: 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20   x is found any 
d050: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f  of the first nCo
d060: 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43  l entries of aiC
d070: 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ol[].*/.static i
d080: 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e  nt hasColumn(con
d090: 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69  st i16 *aiCol, i
d0a0: 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b  nt nCol, int x){
d0b0: 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d  .  while( nCol--
d0c0: 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28   > 0 ) if( x==*(
d0d0: 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72  aiCol++) ) retur
d0e0: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
d0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d100: 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74  outine runs at t
d110: 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e  he end of parsin
d120: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
d130: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
d140: 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54  ** has a WITHOUT
d150: 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20   ROWID clause.  
d160: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
d170: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f  routine is to co
d180: 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e  nvert both.** in
d190: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61  ternal schema da
d1a0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  ta structures an
d1b0: 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  d the generated 
d1c0: 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61  VDBE code so tha
d1d0: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70  t they.** are ap
d1e0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20  propriate for a 
d1f0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
d200: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
d210: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a   rowid table..**
d220: 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65   Changes include
d230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
d240: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f   Convert the OP_
d250: 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f  CreateTable into
d260: 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64   an OP_CreateInd
d270: 65 78 2e 20 20 54 68 65 72 65 20 69 73 0a 2a 2a  ex.  There is.**
d280: 20 20 20 20 20 20 20 20 20 20 6e 6f 20 72 6f 77            no row
d290: 69 64 20 62 74 72 65 65 20 66 6f 72 20 61 20 57  id btree for a W
d2a0: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 20 20 49  ITHOUT ROWID.  I
d2b0: 6e 73 74 65 61 64 2c 20 74 68 65 20 63 61 6e 6f  nstead, the cano
d2c0: 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  nical.**        
d2d0: 20 20 64 61 74 61 20 73 74 6f 72 61 67 65 20 69    data storage i
d2e0: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
d2f0: 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20  ex btree..**    
d300: 20 28 32 29 20 20 42 79 70 61 73 73 20 74 68 65   (2)  Bypass the
d310: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
d320: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d330: 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20  able entry.**   
d340: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50         for the P
d350: 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68  RIMARY KEY as th
d360: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  e primary key in
d370: 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20  dex is now.**   
d380: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
d390: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f  d by the sqlite_
d3a0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d3b0: 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ry of the table 
d3c0: 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28  itself..**     (
d3d0: 33 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65  3)  Set the Inde
d3e0: 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52  x.tnum of the PR
d3f0: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
d400: 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
d410: 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
d420: 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65   to the rootpage
d430: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
d440: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29  able..**     (4)
d450: 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e    Set all column
d460: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
d470: 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65   KEY schema obje
d480: 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c  ct to be NOT NUL
d490: 4c 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41  L..**     (5)  A
d4a0: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
d4b0: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
d4c0: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
d4d0: 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ject.**         
d4e0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 49   so that the PRI
d4f0: 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f  MARY KEY is a co
d500: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54  vering index.  T
d510: 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20  he surplus.**   
d520: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61         columns a
d530: 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e  re part of KeyIn
d540: 66 6f 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61  fo.nXField and a
d550: 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a  re not used for.
d560: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74  **          sort
d570: 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72  ing or lookup or
d580: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63   uniqueness chec
d590: 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20  ks..**     (6)  
d5a0: 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69  Replace the rowi
d5b0: 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75  d tail on all au
d5c0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
d5d0: 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20  rated UNIQUE.** 
d5e0: 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73           indices
d5f0: 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52   with the PRIMAR
d600: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  Y KEY columns..*
d610: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
d620: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
d630: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
d640: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
d650: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
d660: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
d670: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
d680: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
d690: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d6a0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
d6b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d6c0: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
d6d0: 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  he OP_CreateTabl
d6e0: 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f  e opcode that wo
d6f0: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65  uld normally cre
d700: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f  ate the.  ** roo
d710: 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 74  t-page for the t
d720: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
d730: 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f  CreateIndex opco
d740: 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20  de.  The index. 
d750: 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c   ** created will
d760: 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d   become the PRIM
d770: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20  ARY KEY index.. 
d780: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
d790: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
d7a0: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
d7b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
d7c0: 65 74 4f 70 28 76 2c 20 70 50 61 72 73 65 2d 3e  etOp(v, pParse->
d7d0: 61 64 64 72 43 72 54 61 62 29 2d 3e 6f 70 63 6f  addrCrTab)->opco
d7e0: 64 65 20 3d 20 4f 50 5f 43 72 65 61 74 65 49 6e  de = OP_CreateIn
d7f0: 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  dex;.  }..  /* L
d800: 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  ocate the PRIMAR
d810: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72  Y KEY index.  Or
d820: 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20  , if this table 
d830: 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  was originally. 
d840: 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50   ** an INTEGER P
d850: 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65  RIMARY KEY table
d860: 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 50  , create a new P
d870: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
d880: 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  . .  */.  if( pT
d890: 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
d8a0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
d8b0: 69 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  ist;.    pList =
d8c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
d8d0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
d8e0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  , 0);.    if( pL
d8f0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
d900: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
d910: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
d920: 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
d930: 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
d960: 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
d970: 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
d980: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
d990: 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d  tOrder = pParse-
d9a0: 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20  >iPkSortOrder;. 
d9b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
d9c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54  e->pNewTable==pT
d9d0: 61 62 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20  ab );.    pPk = 
d9e0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
d9f0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
da00: 20 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d   0, pList, pTab-
da10: 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20  >keyConf, 0, 0, 
da20: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
da30: 50 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Pk==0 ) return;.
da40: 20 20 20 20 70 50 6b 2d 3e 69 64 78 54 79 70 65      pPk->idxType
da50: 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50   = SQLITE_IDXTYP
da60: 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20  E_PRIMARYKEY;.  
da70: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
da80: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
da90: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
daa0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
dab0: 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 79 70  ab);..    /* Byp
dac0: 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ass the creation
dad0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
dae0: 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 68  KEY btree and th
daf0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
db00: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74      ** table ent
db10: 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  ry. This is only
db20: 20 72 65 71 75 69 72 65 64 20 69 66 20 63 75 72   required if cur
db30: 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e  rently generatin
db40: 67 20 56 44 42 45 0a 20 20 20 20 2a 2a 20 63 6f  g VDBE.    ** co
db50: 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45 20  de for a CREATE 
db60: 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20  TABLE (not when 
db70: 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70  parsing one as p
db80: 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20  art of reading. 
db90: 20 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65     ** a database
dba0: 20 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20   schema).  */.  
dbb0: 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20    if( v ){.     
dbc0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
dbd0: 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
dbe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65     sqlite3VdbeGe
dbf0: 74 4f 70 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d  tOp(v, pPk->tnum
dc00: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 47  )->opcode = OP_G
dc10: 6f 74 6f 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  oto;.    }..    
dc20: 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65  /*.    ** Remove
dc30: 20 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63   all redundant c
dc40: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
dc50: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f  PRIMARY KEY.  Fo
dc60: 72 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67  r example, chang
dc70: 65 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52  e.    ** "PRIMAR
dc80: 59 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c  Y KEY(a,b,a,b,c,
dc90: 62 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73  b,c,d)" into jus
dca0: 74 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61  t "PRIMARY KEY(a
dcb0: 2c 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72  ,b,c,d)".  Later
dcc0: 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73  .    ** code ass
dcd0: 75 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59  umes the PRIMARY
dce0: 20 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   KEY contains no
dcf0: 20 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e   repeated column
dd00: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
dd10: 72 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e  r(i=j=1; i<pPk->
dd20: 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
dd30: 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
dd40: 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  mn(pPk->aiColumn
dd50: 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  , j, pPk->aiColu
dd60: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
dd70: 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d    pPk->nColumn--
dd80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dd90: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
dda0: 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d  lumn[j++] = pPk-
ddb0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
ddc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ddd0: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a  pPk->nKeyCol = j
dde0: 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43  ;.  }.  pPk->isC
ddf0: 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61  overing = 1;.  a
de00: 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b  ssert( pPk!=0 );
de10: 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b  .  nPk = pPk->nK
de20: 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  eyCol;..  /* Mak
de30: 65 20 73 75 72 65 20 65 76 65 72 79 20 63 6f 6c  e sure every col
de40: 75 6d 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41  umn of the PRIMA
de50: 52 59 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55  RY KEY is NOT NU
de60: 4c 4c 2e 20 20 28 45 78 63 65 70 74 2c 0a 20 20  LL.  (Except,.  
de70: 2a 2a 20 64 6f 20 6e 6f 74 20 65 6e 66 6f 72 63  ** do not enforc
de80: 65 20 74 68 69 73 20 66 6f 72 20 69 6d 70 6f 73  e this for impos
de90: 74 65 72 20 74 61 62 6c 65 73 2e 29 20 2a 2f 0a  ter tables.) */.
dea0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
deb0: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b  imposterTable ){
dec0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ded0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
dee0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d   pTab->aCol[pPk-
def0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f  >aiColumn[i]].no
df00: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  tNull = 1;.    }
df10: 0a 20 20 20 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f  .    pPk->uniqNo
df20: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a  tNull = 1;.  }..
df30: 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
df40: 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ge of the PRIMAR
df50: 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62  Y KEY is the tab
df60: 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a  le root page */.
df70: 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54    pPk->tnum = pT
df80: 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20  ab->tnum;..  /* 
df90: 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Update the in-me
dfa0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
dfb0: 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55  ion of all UNIQU
dfc0: 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e  E indices by con
dfd0: 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  verting.  ** the
dfe0: 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c   final rowid col
dff0: 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20  umn into one or 
e000: 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
e010: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
e020: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
e030: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
e040: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
e050: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
e060: 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69  n;.    if( IsPri
e070: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
e080: 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  x) ) continue;. 
e090: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c     for(i=n=0; i<
e0a0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
e0b0: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
e0c0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
e0d0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
e0e0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
e0f0: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
e100: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
e110: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
e120: 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20  x is a superset 
e130: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
e140: 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78  ey */.      pIdx
e150: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78  ->nColumn = pIdx
e160: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
e170: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
e180: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
e190: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
e1a0: 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  Idx, pIdx->nKeyC
e1b0: 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol+n) ) return;.
e1c0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70      for(i=0, j=p
e1d0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c  Idx->nKeyCol; i<
e1e0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
e1f0: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
e200: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
e210: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
e220: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
e230: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
e240: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20  ->aiColumn[j] = 
e250: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e260: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
e270: 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d  azColl[j] = pPk-
e280: 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
e290: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
e2a0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
e2b0: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
e2c0: 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  >=pIdx->nKeyCol+
e2d0: 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n );.    assert(
e2e0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
e2f0: 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  j );.  }..  /* A
e300: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
e310: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
e320: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
e330: 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61  */.  if( nPk<pTa
e340: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69  b->nCol ){.    i
e350: 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  f( resizeIndexOb
e360: 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54  ject(db, pPk, pT
e370: 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75  ab->nCol) ) retu
e380: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
e390: 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e   j=nPk; i<pTab->
e3a0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
e3b0: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
e3c0: 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  (pPk->aiColumn, 
e3d0: 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  j, i) ){.       
e3e0: 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e   assert( j<pPk->
e3f0: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
e400: 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e     pPk->aiColumn
e410: 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  [j] = i;.       
e420: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20   pPk->azColl[j] 
e430: 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
e440: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
e450: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
e460: 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d  t( pPk->nColumn=
e470: 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =j );.    assert
e480: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20  ( pTab->nCol==j 
e490: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e4a0: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70  pPk->nColumn = p
e4b0: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d  Tab->nCol;.  }.}
e4c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e4d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
e4e0: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e  o report the fin
e4f0: 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d  al ")" that term
e500: 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41  inates.** a CREA
e510: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
e520: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  nt..**.** The ta
e530: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
e540: 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20  at other action 
e550: 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65  routines have be
e560: 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69  en building.** i
e570: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
e580: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
e590: 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  les, assuming no
e5a0: 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20   errors have.** 
e5b0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  occurred..**.** 
e5c0: 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  An entry for the
e5d0: 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69   table is made i
e5e0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
e5f0: 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65  le on disk, unle
e600: 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20  ss.** this is a 
e610: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e620: 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  or db->init.busy
e630: 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69  ==1.  When db->i
e640: 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69  nit.busy==1.** i
e650: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
e660: 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
e670: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62  e_master table b
e680: 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a  ecause we just.*
e690: 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74  * connected to t
e6a0: 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62  he database or b
e6b0: 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74  ecause the sqlit
e6c0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68  e_master table h
e6d0: 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63  as.** recently c
e6e0: 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65  hanged, so the e
e6f0: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61  ntry for this ta
e700: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
e710: 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c  ts in.** the sql
e720: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
e730: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e  .  We do not wan
e740: 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61  t to create it a
e750: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gain..**.** If t
e760: 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d  he pSelect argum
e770: 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ent is not NULL,
e780: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
e790: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  his routine.** w
e7a0: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  as called to cre
e7b0: 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65  ate a table gene
e7c0: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a  rated from a .**
e7d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e   "CREATE TABLE .
e7e0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  .. AS SELECT ...
e7f0: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  " statement.  Th
e800: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
e810: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62  f.** the new tab
e820: 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68  le will match th
e830: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
e840: 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
e850: 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61  oid sqlite3EndTa
e860: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
e870: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e880: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
e890: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e  */.  Token *pCon
e8a0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
e8b0: 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66  The ',' token af
e8c0: 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  ter the last col
e8d0: 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54  umn defn. */.  T
e8e0: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
e8f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29         /* The ')
e900: 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73  ' before options
e910: 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
e920: 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62  ABLE */.  u8 tab
e930: 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20 20 20  Opts,           
e940: 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65    /* Extra table
e950: 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c   options. Usuall
e960: 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  y 0. */.  Select
e970: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
e980: 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d    /* Select from
e990: 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41   a "CREATE ... A
e9a0: 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a  S SELECT" */.){.
e9b0: 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20    Table *p;     
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e9d0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a  he new table */.
e9e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e9f0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54  pParse->db; /* T
ea00: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
ea10: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
ea20: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
ea30: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
ea40: 65 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 74  e in which the t
ea50: 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20  able lives */.  
ea60: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
ea70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
ea80: 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66  implied index of
ea90: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20   the table */.. 
eaa0: 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20   if( pEnd==0 && 
eab0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
eac0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
ead0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
eae0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70  locFailed );.  p
eaf0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
eb00: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
eb10: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
eb20: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
eb30: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
eb40: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
eb50: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
eb60: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
eb70: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
eb80: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
eb90: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
eba0: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
ebb0: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
ebc0: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
ebd0: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
ebe0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
ebf0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
ec00: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
ec10: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
ec20: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
ec30: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
ec40: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
ec50: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
ec60: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
ec70: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
ec80: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
ec90: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
eca0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
ecb0: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
ecc0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
ecd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
ece0: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ial processing f
ecf0: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
ed00: 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28   Tables */.  if(
ed10: 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69   tabOpts & TF_Wi
ed20: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20  thoutRowid ){.  
ed30: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
ed40: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
ed50: 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  ement) ){.      
ed60: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ed70: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
ed80: 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54    "AUTOINCREMENT
ed90: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   not allowed on 
eda0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
edb0: 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65  bles");.      re
edc0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
edd0: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
ede0: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
edf0: 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Key)==0 ){.     
ee00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ee10: 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52  (pParse, "PRIMAR
ee20: 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e  Y KEY missing on
ee30: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a   table %s", p->z
ee40: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
ee50: 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c  {.      p->tabFl
ee60: 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75  ags |= TF_Withou
ee70: 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69  tRowid | TF_NoVi
ee80: 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20  sibleRowid;.    
ee90: 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f    convertToWitho
eea0: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61  utRowidTable(pPa
eeb0: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  rse, p);.    }. 
eec0: 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   }..  iDb = sqli
eed0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
eee0: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
eef0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
ef00: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
ef10: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
ef20: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
ef30: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
ef40: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
ef50: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
ef60: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
ef70: 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
ef80: 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65  rse, p, NC_IsChe
ef90: 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b  ck, 0, p->pCheck
efa0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
efb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
efc0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a  _OMIT_CHECK) */.
efd0: 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
efe0: 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73  he average row s
eff0: 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ize for the tabl
f000: 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d  e and for all im
f010: 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f  plied indices */
f020: 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  .  estimateTable
f030: 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28  Width(p);.  for(
f040: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
f050: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
f060: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74  >pNext){.    est
f070: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
f080: 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pIdx);.  }..  /*
f090: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
f0a0: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
f0b0: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
f0c0: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
f0d0: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
f0e0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
f0f0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
f100: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
f110: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
f120: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
f130: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
f140: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
f150: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
f160: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
f170: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
f180: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
f190: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
f1a0: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
f1b0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
f1c0: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
f1d0: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
f1e0: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
f1f0: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
f200: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
f210: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
f220: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
f230: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
f240: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
f250: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
f260: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f270: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
f280: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
f290: 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n;..    sqlite3V
f2a0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f2b0: 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Close, 0);..    
f2c0: 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69  /* .    ** Initi
f2d0: 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20  alize zType for 
f2e0: 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20  the new view or 
f2f0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
f300: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
f310: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
f320: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
f330: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
f340: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
f350: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
f360: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f370: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
f380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
f390: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
f3a0: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
f3b0: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
f3c0: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
f3d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
f3e0: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
f3f0: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
f400: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
f410: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
f420: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
f430: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
f440: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
f450: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
f460: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
f470: 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74  ble is in regist
f480: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
f490: 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ot..    **.    *
f4a0: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
f4b0: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
f4c0: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
f4d0: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
f4e0: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
f4f0: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
f500: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
f510: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
f520: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
f530: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
f540: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f550: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
f560: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
f570: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
f580: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
f590: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
f5a0: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
f5b0: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
f5c0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
f5d0: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
f5e0: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
f5f0: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
f600: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
f610: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
f620: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
f630: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
f640: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
f650: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
f660: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
f670: 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20  st;    /* Where 
f680: 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c  the SELECT shoul
f690: 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20  d store results 
f6a0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
f6b0: 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20  Yield;       /* 
f6c0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
f6d0: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72   co-routine entr
f6e0: 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  y-point */.     
f6f0: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
f700: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
f710: 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f  he co-routine */
f720: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
f730: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  c;         /* A 
f740: 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73  record to be ins
f750: 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ert into the new
f760: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
f770: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20  int regRowid;   
f780: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20      /* Rowid of 
f790: 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20  the next row to 
f7a0: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20  insert */.      
f7b0: 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b  int addrInsLoop;
f7c0: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68      /* Top of th
f7d0: 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72  e loop for inser
f7e0: 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20  ting rows */.   
f7f0: 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61     Table *pSelTa
f800: 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c  b;     /* A tabl
f810: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
f820: 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
f830: 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65  lts */..      re
f840: 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73  gYield = ++pPars
f850: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
f860: 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65  egRec = ++pParse
f870: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65  ->nMem;.      re
f880: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
f890: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
f8a0: 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54  ssert(pParse->nT
f8b0: 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71  ab==1);.      sq
f8c0: 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
f8d0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
f8e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f8f0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
f900: 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  1, pParse->regRo
f910: 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  ot, iDb);.      
f920: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f930: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32  eP5(v, OPFLAG_P2
f940: 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50  ISREG);.      pP
f950: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
f960: 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20        addrTop = 
f970: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f980: 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
f990: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f9a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
f9b0: 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  tCoroutine, regY
f9c0: 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70  ield, 0, addrTop
f9d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f9e0: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
f9f0: 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
fa00: 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
fa10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
fa20: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
fa30: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
fa40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fa50: 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
fa60: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
fa70: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
fa80: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
fa90: 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20   addrTop - 1);. 
faa0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
fab0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
fac0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
fad0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
fae0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
faf0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
fb00: 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20   if( pSelTab==0 
fb10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
fb20: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
fb30: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 );.      p->n
fb40: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
fb50: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43  Col;.      p->aC
fb60: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
fb70: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
fb80: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
fb90: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
fba0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
fbb0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
fbc0: 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
fbd0: 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d     addrInsLoop =
fbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fbf0: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
fc00: 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
fc10: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
fc20: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
fc30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fc40: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
fc50: 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74  dest.iSdst, dest
fc60: 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b  .nSdst, regRec);
fc70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
fc80: 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
fc90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fca0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fcb0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c   OP_NewRowid, 1,
fcc0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
fcd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fce0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
fcf0: 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67  , 1, regRec, reg
fd00: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
fd10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fd20: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
fd30: 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20  ddrInsLoop);.   
fd40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
fd50: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e  mpHere(v, addrIn
fd60: 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  sLoop);.      sq
fd70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fd80: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b  v, OP_Close, 1);
fd90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
fda0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c  ompute the compl
fdb0: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
fdc0: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
fdd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
fde0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74  ect ){.      zSt
fdf0: 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65  mt = createTable
fe00: 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  Stmt(db, p);.   
fe10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f   }else{.      To
fe20: 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62  ken *pEnd2 = tab
fe30: 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e  Opts ? &pParse->
fe40: 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e  sLastToken : pEn
fe50: 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e  d;.      n = (in
fe60: 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50  t)(pEnd2->z - pP
fe70: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
fe80: 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  .z);.      if( p
fe90: 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20  End2->z[0]!=';' 
fea0: 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b  ) n += pEnd2->n;
feb0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
fec0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
fed0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  , .          "CR
fee0: 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
fef0: 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
ff00: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20  ->sNameToken.z. 
ff10: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
ff20: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
ff30: 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
ff40: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
ff50: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
ff60: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
ff70: 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
ff80: 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
ff90: 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
ffa0: 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
ffb0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
ffc0: 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20  ve collected..  
ffd0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
ffe0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
fff0: 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54  se,.      "UPDAT
10000 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20  E %Q.%s ".      
10010 20 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73     "SET type='%s
10020 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f  ', name=%Q, tbl_
10030 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67  name=%Q, rootpag
10040 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a  e=#%d, sql=%Q ".
10050 20 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f         "WHERE ro
10060 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20  wid=#%d",.      
10070 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
10080 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
10090 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79  (iDb),.      zTy
100a0 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
100b0 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
100c0 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
100d0 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
100e0 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
100f0 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
10100 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
10110 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
10120 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
10130 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
10140 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
10150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10160 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
10170 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
10180 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
10190 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
101a0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
101b0 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
101c0 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
101d0 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
101e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
101f0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
10200 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a  utoincrement ){.
10210 20 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20        Db *pDb = 
10220 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
10230 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
10240 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
10250 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
10260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  );.      if( pDb
10270 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
10280 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
10290 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
102a0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
102b0 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
102c0 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  BLE %Q.sqlite_se
102d0 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29  quence(name,seq)
102e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ",.          pDb
102f0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  ->zName.        
10300 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10310 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
10320 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
10330 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
10340 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
10350 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
10360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
10370 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
10380 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
10390 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
103a0 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71  b, "tbl_name='%q
103b0 27 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69  ' AND type!='tri
103c0 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65  gger'", p->zName
103d0 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ));.  }...  /* A
103e0 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
103f0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
10400 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
10410 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
10420 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
10430 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61  t.busy ){.    Ta
10440 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53  ble *pOld;.    S
10450 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
10460 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
10470 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10480 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
10490 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
104a0 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65     pOld = sqlite
104b0 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63  3HashInsert(&pSc
104c0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70  hema->tblHash, p
104d0 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20  ->zName, p);.   
104e0 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
104f0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f     assert( p==pO
10500 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ld );  /* Malloc
10510 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
10520 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73  d inside HashIns
10530 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64  ert() */.      d
10540 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10550 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
10560 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  n;.    }.    pPa
10570 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
10580 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67   0;.    db->flag
10590 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
105a0 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e  rnChanges;..#ifn
105b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
105c0 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
105d0 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
105e0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
105f0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
10600 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
10610 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
10620 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
10630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
10640 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
10650 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
10660 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
10670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
10680 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
10690 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
106a0 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68   (int)((const ch
106b0 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
106c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  zName);.      p-
106d0 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20  >addColOffset = 
106e0 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38  13 + sqlite3Utf8
106f0 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e  CharLen(zName, n
10700 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Name);.    }.#en
10710 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dif.  }.}..#ifnd
10720 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10730 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
10740 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
10750 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
10760 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
10770 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
10780 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
10790 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
107a0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
107b0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
107c0 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
107d0 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
107e0 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
107f0 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
10800 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
10810 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
10820 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
10830 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
10840 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
10850 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
10860 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
10870 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
10880 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
10890 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
108a0 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
108b0 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
108c0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
108d0 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
108e0 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20  t isTemp,       
108f0 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
10900 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
10910 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
10920 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
10930 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  s error messages
10940 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79   if VIEW already
10950 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
10960 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
10970 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
10980 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64  *z;.  Token sEnd
10990 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
109a0 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  ;.  Token *pName
109b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b   = 0;.  int iDb;
109c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
109d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
109e0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
109f0 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
10a00 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
10a10 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72  , "parameters ar
10a20 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
10a30 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71   views");.    sq
10a40 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
10a50 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
10a60 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10a70 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
10a80 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
10a90 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
10aa0 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
10ab0 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
10ac0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
10ad0 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
10ae0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
10af0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
10b00 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
10b10 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
10b20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
10b30 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
10b40 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
10b50 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
10b60 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
10b70 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
10b80 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49  );.  sqlite3FixI
10b90 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
10ba0 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20  e, iDb, "view", 
10bb0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
10bc0 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
10bd0 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29  sFix, pSelect) )
10be0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
10bf0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
10c00 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
10c10 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rn;.  }..  /* Ma
10c20 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
10c30 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
10c40 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
10c50 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
10c60 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
10c70 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
10c80 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
10c90 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
10ca0 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
10cb0 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
10cc0 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
10cd0 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
10ce0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
10cf0 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
10d00 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
10d10 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
10d20 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
10d30 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65  .  */.  p->pSele
10d40 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
10d50 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
10d60 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
10d70 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  E);.  sqlite3Sel
10d80 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
10d90 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62  elect);.  if( db
10da0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10db0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
10dc0 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
10dd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
10de0 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
10df0 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20  ent.  Make sEnd 
10e00 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68  point to.  ** th
10e10 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45  e end..  */.  sE
10e20 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61  nd = pParse->sLa
10e30 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41  stToken;.  if( A
10e40 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21  LWAYS(sEnd.z[0]!
10e50 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d  =0) && sEnd.z[0]
10e60 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
10e70 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
10e80 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
10e90 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e  .  n = (int)(sEn
10ea0 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29  d.z - pBegin->z)
10eb0 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e  ;.  z = pBegin->
10ec0 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c 57 41  z;.  while( ALWA
10ed0 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c 69 74  YS(n>0) && sqlit
10ee0 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d  e3Isspace(z[n-1]
10ef0 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
10f00 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
10f10 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
10f20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
10f30 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
10f40 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
10f50 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
10f60 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
10f70 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
10f80 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30  , 0, &sEnd, 0, 0
10f90 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
10fa0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
10fb0 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
10fc0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
10fd0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
10fe0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10ff0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11000 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
11010 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
11020 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
11030 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
11040 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
11050 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
11060 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
11070 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
11080 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
11090 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
110a0 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
110b0 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
110c0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
110d0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
110e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
110f0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
11100 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
11110 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
11120 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
11130 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
11140 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
11150 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
11160 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
11170 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
11180 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
11190 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
111a0 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
111b0 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
111c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
111d0 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
111e0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
111f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
11200 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
11210 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
11220 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
11230 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11240 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
11250 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
11260 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
11270 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69  errors */.  sqli
11280 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b  te3_xauth xAuth;
11290 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
112a0 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f  xAuth pointer */
112b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ..  assert( pTab
112c0 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  le );..#ifndef S
112d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
112e0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71  ALTABLE.  if( sq
112f0 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e  lite3VtabCallCon
11300 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61  nect(pParse, pTa
11310 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ble) ){.    retu
11320 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
11330 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72  .  }.  if( IsVir
11340 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72  tual(pTable) ) r
11350 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
11360 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11370 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41  OMIT_VIEW.  /* A
11380 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d   positive nCol m
11390 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73  eans the columns
113a0 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
113b0 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c  view are.  ** al
113c0 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a  ready known..  *
113d0 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
113e0 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20  nCol>0 ) return 
113f0 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74  0;..  /* A negat
11400 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70  ive nCol is a sp
11410 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61  ecial marker mea
11420 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65  ning that we are
11430 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
11440 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74  trying to comput
11450 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
11460 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72  es.  If we enter
11470 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
11480 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69  th.  ** a negati
11490 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e  ve nCol, it mean
114a0 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69  s two or more vi
114b0 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c  ews form a loop,
114c0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a   like this:.  **
114d0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
114e0 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c   VIEW one AS SEL
114f0 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a  ECT * FROM two;.
11500 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
11510 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45  VIEW two AS SELE
11520 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20  CT * FROM one;. 
11530 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
11540 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f  y, the error abo
11550 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  ve is now caught
11560 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
11570 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  ng this point.. 
11580 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c   ** But the foll
11590 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74  owing test is st
115a0 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73  ill important as
115b0 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70   it does come up
115c0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  .  ** in the fol
115d0 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20  lowing:.  ** .  
115e0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
115f0 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b  BLE main.ex1(a);
11600 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
11610 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41   TEMP VIEW ex1 A
11620 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  S SELECT a FROM 
11630 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45  ex1;.  **     SE
11640 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70  LECT * FROM temp
11650 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28  .ex1;.  */.  if(
11660 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20   pTable->nCol<0 
11670 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11680 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11690 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75  view %s is circu
116a0 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20  larly defined", 
116b0 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
116c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
116d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
116e0 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a  le->nCol>=0 );..
116f0 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
11700 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
11710 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d  s we need to com
11720 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  pute the table n
11730 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20  ames..  ** Note 
11740 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f  that the call to
11750 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
11760 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c  tOfSelect() will
11770 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a   expand any.  **
11780 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e   "*" elements in
11790 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74   the results set
117a0 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64   of the view and
117b0 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72   will assign cur
117c0 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  sors.  ** to the
117d0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
117e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42   FROM clause.  B
117f0 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e  ut we do not wan
11800 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a  t these changes.
11810 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61    ** to be perma
11820 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f  nent.  So the co
11830 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e  mputation is don
11840 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  e on a copy of t
11850 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73  he SELECT.  ** s
11860 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
11870 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
11880 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
11890 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29  Table->pSelect )
118a0 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74  ;.  pSel = sqlit
118b0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
118c0 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  pTable->pSelect,
118d0 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20   0);.  if( pSel 
118e0 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c 65  ){.    u8 enable
118f0 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e  Lookaside = db->
11900 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
11910 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72  ed;.    n = pPar
11920 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
11930 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
11940 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
11950 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
11960 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
11970 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = -1;.    db->lo
11980 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
11990 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
119a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
119b0 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74  IZATION.    xAut
119c0 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20  h = db->xAuth;. 
119d0 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30     db->xAuth = 0
119e0 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  ;.    pSelTab = 
119f0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
11a00 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
11a10 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e   pSel);.    db->
11a20 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23  xAuth = xAuth;.#
11a30 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62  else.    pSelTab
11a40 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
11a50 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
11a60 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69  se, pSel);.#endi
11a70 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  f.    db->lookas
11a80 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 65  ide.bEnabled = e
11a90 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a  nableLookaside;.
11aa0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
11ab0 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53   = n;.    if( pS
11ac0 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61  elTab ){.      a
11ad0 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
11ae0 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
11af0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70  pTable->nCol = p
11b00 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  SelTab->nCol;.  
11b10 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
11b20 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
11b30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
11b40 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
11b50 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
11b60 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
11b70 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
11b80 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
11b90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11ba0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
11bb0 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70  db, 0, pTable->p
11bc0 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20  Schema) );.     
11bd0 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
11be0 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d  ->schemaFlags |=
11bf0 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
11c00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11c10 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
11c20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b  = 0;.      nErr+
11c30 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  +;.    }.    sql
11c40 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
11c50 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20  (db, pSel);.  } 
11c60 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b  else {.    nErr+
11c70 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  +;.  }.#endif /*
11c80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11c90 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
11ca0 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
11cb0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
11cc0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
11cd0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11ce0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
11cf0 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
11d00 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
11d10 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
11d20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
11d30 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
11d40 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
11d50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
11d60 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
11d70 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
11d80 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
11d90 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
11da0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
11db0 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
11dc0 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
11dd0 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
11de0 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
11df0 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
11e00 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
11e10 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
11e20 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
11e30 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
11e40 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
11e50 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
11e60 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
11e70 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
11e80 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
11e90 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
11ea0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
11eb0 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
11ec0 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
11ed0 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
11ee0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
11ef0 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
11f00 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
11f10 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
11f20 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
11f30 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
11f40 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
11f50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
11f60 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
11f70 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11f80 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
11f90 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
11fa0 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
11fb0 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
11fc0 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
11fd0 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
11fe0 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
11ff0 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
12000 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
12010 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
12020 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
12030 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
12040 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
12050 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
12060 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
12070 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
12080 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
12090 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
120a0 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
120b0 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
120c0 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
120d0 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
120e0 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
120f0 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
12100 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
12110 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
12120 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
12130 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
12140 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
12150 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
12160 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
12170 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
12180 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
12190 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
121a0 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
121b0 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
121c0 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
121d0 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
121e0 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
121f0 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
12200 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
12210 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
12220 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
12230 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
12240 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
12250 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
12260 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
12270 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
12280 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
12290 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
122a0 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
122b0 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
122c0 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
122d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
122e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
122f0 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
12300 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
12310 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
12320 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
12330 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
12340 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
12350 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
12360 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
12370 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12380 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
12390 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
123a0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
123b0 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
123c0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
123d0 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
123e0 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
123f0 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
12400 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
12410 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
12420 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
12430 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
12440 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
12450 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
12460 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
12470 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
12480 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
12490 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
124a0 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
124b0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
124c0 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
124d0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
124e0 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
124f0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
12500 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
12510 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
12520 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
12530 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
12540 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
12550 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
12560 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
12570 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
12580 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
12590 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
125a0 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
125b0 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
125c0 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
125d0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
125e0 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
125f0 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
12600 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
12610 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
12620 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
12630 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
12640 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
12650 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
12660 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12670 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
12680 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
12690 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
126a0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
126b0 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
126c0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
126d0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
126e0 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
126f0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12700 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
12710 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12720 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
12730 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
12740 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
12750 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
12760 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12770 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
12780 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
12790 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
127a0 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
127b0 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
127c0 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
127d0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
127e0 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
127f0 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
12800 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
12810 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
12820 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
12830 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
12840 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
12850 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
12860 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
12870 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
12880 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
12890 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
128a0 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
128b0 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
128c0 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
128d0 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
128e0 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
128f0 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
12900 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
12910 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
12920 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
12930 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
12940 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
12950 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
12960 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
12970 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
12980 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
12990 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
129a0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
129b0 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
129c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
129d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
129e0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
129f0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
12a00 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
12a10 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
12a20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
12a30 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
12a40 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
12a50 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
12a60 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
12a70 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
12a80 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
12a90 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
12aa0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
12ab0 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
12ac0 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
12ad0 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
12ae0 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
12af0 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
12b00 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
12b10 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
12b20 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
12b30 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
12b40 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
12b50 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12b60 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12b70 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
12b80 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
12b90 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12ba0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
12bb0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
12bc0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
12bd0 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
12be0 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
12bf0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
12c00 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
12c10 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
12c20 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
12c30 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
12c40 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
12c50 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
12c60 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
12c70 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
12c80 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
12c90 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12ca0 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
12cb0 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
12cc0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
12cd0 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
12ce0 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
12cf0 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
12d00 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
12d10 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
12d20 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
12d30 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
12d40 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
12d50 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
12d60 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
12d70 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
12d80 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
12d90 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
12da0 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
12db0 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
12dc0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
12dd0 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
12de0 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
12df0 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
12e00 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
12e10 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
12e20 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
12e30 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
12e40 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
12e50 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
12e60 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
12e70 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
12e80 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
12e90 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
12ea0 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
12eb0 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
12ec0 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
12ed0 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
12ee0 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
12ef0 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
12f00 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
12f10 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
12f20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
12f30 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
12f40 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
12f50 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
12f60 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
12f70 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
12f80 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
12f90 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
12fa0 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
12fb0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
12fc0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
12fd0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
12fe0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
12ff0 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
13000 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13010 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
13020 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
13030 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
13040 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
13050 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
13060 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
13070 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
13080 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
13090 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
130a0 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
130b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
130c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
130d0 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
130e0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
130f0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
13100 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
13110 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
13120 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64  && iDb<pParse->d
13130 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20  b->nDb );.      
13140 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
13150 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
13160 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
13170 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
13180 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
13190 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
131a0 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
131b0 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
131c0 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20  atN tables (for 
131d0 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a  N in (1,2,3)).**
131e0 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e   after a DROP IN
131f0 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c  DEX or DROP TABL
13200 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  E command..*/.st
13210 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
13220 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
13230 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13240 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
13250 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
13260 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13280 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75   The database nu
13290 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  mber */.  const 
132a0 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20  char *zType,    
132b0 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62   /* "idx" or "tb
132c0 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  l" */.  const ch
132d0 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f  ar *zName      /
132e0 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20  * Name of index 
132f0 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  or table */.){. 
13300 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
13310 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
13320 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
13330 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f  iDb].zName;.  fo
13340 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b  r(i=1; i<=4; i++
13350 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62  ){.    char zTab
13360 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [24];.    sqlite
13370 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13380 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71  f(zTab),zTab,"sq
13390 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b  lite_stat%d",i);
133a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
133b0 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
133c0 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e  ->db, zTab, zDbN
133d0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
133e0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
133f0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
13400 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
13410 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
13420 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  ,.        zDbNam
13430 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20  e, zTab, zType, 
13440 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
13450 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13460 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13470 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e  to drop a table.
13480 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13490 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61  CodeDropTable(Pa
134a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
134b0 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44  le *pTab, int iD
134c0 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  b, int isView){.
134d0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
134e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
134f0 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
13500 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62   *pTrigger;.  Db
13510 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
13520 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71  [iDb];..  v = sq
13530 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13540 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
13550 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
13560 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
13570 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
13580 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
13590 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
135a0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
135b0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
135c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
135d0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
135e0 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gin);.  }.#endif
135f0 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
13600 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
13610 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
13620 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
13630 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  . Code.  ** is g
13640 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
13650 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13660 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
13670 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65  d/or.  ** sqlite
13680 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
13690 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
136a0 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
136b0 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
136c0 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
136d0 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
136e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
136f0 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
13700 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
13710 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  || .        pTri
13720 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
13730 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
13740 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
13750 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
13760 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
13770 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
13780 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
13790 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
137a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
137b0 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NCREMENT.  /* Re
137c0 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
137d0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
137e0 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
137f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
13800 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
13810 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
13820 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
13830 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
13840 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65  pped.  ** at the
13850 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
13860 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
13870 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
13880 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f  needs to.  ** mo
13890 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
138a0 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
138b0 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
138c0 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a  acuum mode)..  *
138d0 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  /.  if( pTab->ta
138e0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
138f0 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
13900 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
13910 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
13920 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
13930 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
13940 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
13950 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ,.      pDb->zNa
13960 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
13970 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
13980 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
13990 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
139a0 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
139b0 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
139c0 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61  r to the.  ** ta
139d0 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
139e0 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
139f0 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
13a00 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
13a10 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20  .  ** every row 
13a20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
13a30 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
13a40 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
13a50 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72  ne being.  ** dr
13a60 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20  opped. Triggers 
13a70 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
13a80 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61  rately because a
13a90 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a   trigger can be.
13aa0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
13ab0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
13ac0 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
13ad0 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
13ae0 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  her.  ** databas
13af0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
13b00 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13b10 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c  rse, .      "DEL
13b20 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
13b30 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
13b40 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
13b50 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62  ger'",.      pDb
13b60 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ->zName, SCHEMA_
13b70 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62  TABLE(iDb), pTab
13b80 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
13b90 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
13ba0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13bb0 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
13bc0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
13bd0 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
13be0 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
13bf0 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
13c00 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
13c10 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  d modify.  ** th
13c20 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
13c30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
13c40 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13c50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13c60 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
13c70 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
13c80 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
13c90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
13ca0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
13cb0 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
13cc0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
13cd0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
13ce0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
13cf0 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
13d00 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
13d10 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, iDb);.}../*.*
13d20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13d30 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
13d40 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
13d50 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
13d60 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
13d70 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
13d80 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
13d90 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
13da0 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
13db0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
13dc0 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
13dd0 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
13de0 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
13df0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
13e00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13e10 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
13e20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  iDb;..  if( db->
13e30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13e40 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13e50 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
13e60 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
13e70 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nErr==0 );.  ass
13e80 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
13e90 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  ==1 );.  if( sql
13ea0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
13eb0 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
13ec0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
13ed0 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
13ee0 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a  >suppressErr++;.
13ef0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
13f00 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
13f10 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20  pParse, isView, 
13f20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20  &pName->a[0]);. 
13f30 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
13f40 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a  >suppressErr--;.
13f50 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
13f60 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20  {.    if( noErr 
13f70 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
13f80 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70  ifyNamedSchema(p
13f90 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
13fa0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
13fb0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13fc0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
13fd0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
13fe0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
13ff0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
14000 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
14010 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
14020 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69  ..  /* If pTab i
14030 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  s a virtual tabl
14040 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43  e, call ViewGetC
14050 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20  olumnNames() to 
14060 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69  ensure.  ** it i
14070 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  s initialized.. 
14080 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
14090 75 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c  ual(pTab) && sql
140a0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
140b0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
140c0 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Tab) ){.    goto
140d0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
140e0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
140f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
14100 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
14110 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f  int code;.    co
14120 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
14130 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
14140 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
14150 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
14160 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
14170 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
14180 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rg2 = 0;.    if(
14190 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
141a0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
141b0 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
141c0 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
141d0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
141e0 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
141f0 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
14200 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
14210 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
14220 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14230 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
14240 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
14250 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
14260 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
14270 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  IEW;.      }.#if
14280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14290 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
142a0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
142b0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
142c0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
142d0 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a  TE_DROP_VTABLE;.
142e0 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71        zArg2 = sq
142f0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
14300 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e  b, pTab)->pMod->
14310 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  zName;.#endif.  
14320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14330 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
14340 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
14350 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14360 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
14370 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
14380 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
14390 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
143a0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
143b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
143c0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
143d0 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
143e0 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29  ame, zArg2, zDb)
143f0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14400 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14410 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
14420 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14430 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
14440 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
14450 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
14460 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
14470 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
14480 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
14490 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
144a0 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
144b0 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
144c0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
144d0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
144e0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  me, "sqlite_stat
144f0 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20  ", 11)!=0 ){.   
14500 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14510 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
14520 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
14530 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
14540 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
14550 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14560 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14570 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
14580 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54  /* Ensure DROP T
14590 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64  ABLE is not used
145a0 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20   on a view, and 
145b0 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74  DROP VIEW is not
145c0 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20   used.  ** on a 
145d0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
145e0 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
145f0 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
14600 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14610 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
14620 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
14630 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
14640 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14650 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14660 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
14670 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
14680 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
14690 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
146a0 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
146b0 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
146c0 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
146d0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
146e0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
146f0 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
14700 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14710 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
14720 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
14730 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
14740 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
14750 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
14760 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
14770 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
14780 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
14790 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
147a0 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
147b0 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
147c0 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
147d0 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e  b, "tbl", pTab->
147e0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
147f0 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70  te3FkDropTable(p
14800 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54  Parse, pName, pT
14810 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
14820 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50  CodeDropTable(pP
14830 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c  arse, pTab, iDb,
14840 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65   isView);.  }..e
14850 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
14860 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
14870 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
14880 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
14890 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
148a0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
148b0 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
148c0 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
148d0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
148e0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
148f0 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
14900 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
14910 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
14920 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
14930 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
14940 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
14950 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
14960 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
14970 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
14980 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
14990 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
149a0 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
149b0 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22   to (a.k.a the "
149c0 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20  parent" table). 
149d0 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
149e0 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69  t.** of tables i
149f0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f  n the parent pTo
14a00 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63   table.  flags c
14a10 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
14a20 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
14a30 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
14a40 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
14a50 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
14a60 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
14a70 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
14a80 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
14a90 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
14aa0 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
14ab0 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
14ac0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
14ad0 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
14ae0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
14af0 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
14b00 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a  wTable field..**
14b10 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
14b20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
14b30 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
14b40 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
14b50 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
14b60 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
14b70 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
14b80 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
14b90 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
14ba0 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
14bb0 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
14bc0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
14bd0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14be0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
14bf0 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
14c00 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
14c10 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
14c20 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
14c30 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
14c40 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
14c50 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
14c60 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
14c70 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
14c80 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
14c90 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
14ca0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
14cb0 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
14cc0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
14cd0 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
14ce0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14cf0 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
14d00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
14d10 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
14d20 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46   *pFKey = 0;.  F
14d30 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20  Key *pNextTo;.  
14d40 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
14d50 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
14d60 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
14d70 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
14d80 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
14d90 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
14da0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
14db0 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
14dc0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
14dd0 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
14de0 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
14df0 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
14e00 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
14e10 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
14e20 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
14e30 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
14e40 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
14e50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14e60 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
14e70 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
14e80 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
14e90 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
14ea0 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
14eb0 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
14ec0 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
14ed0 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
14ee0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
14ef0 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
14f00 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
14f10 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
14f20 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
14f30 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
14f40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14f50 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
14f60 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
14f70 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
14f80 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
14f90 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
14fa0 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
14fb0 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
14fc0 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
14fd0 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
14fe0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
14ff0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
15000 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
15010 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
15020 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
15030 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
15040 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
15050 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
15060 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
15070 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
15080 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
15090 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
150a0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
150b0 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
150c0 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
150d0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
150e0 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
150f0 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
15100 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
15110 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
15120 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
15130 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
15140 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
15150 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
15160 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
15170 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
15180 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
15190 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
151a0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
151b0 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
151c0 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
151d0 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
151e0 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
151f0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
15200 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
15210 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
15220 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
15230 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
15240 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
15250 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
15260 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
15270 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
15280 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
15290 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
152a0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
152b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
152c0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
152d0 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
152e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
152f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15300 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
15310 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
15320 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15330 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
15340 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
15350 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
15360 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
15370 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
15380 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
15390 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
153a0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
153b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
153c0 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
153d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
153e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
153f0 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
15400 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
15410 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
15420 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
15430 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
15440 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
15450 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
15460 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
15470 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
15480 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
15490 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
154a0 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
154b0 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
154c0 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
154d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
154e0 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
154f0 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
15500 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
15510 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
15520 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
15530 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
15540 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
15550 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
15560 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
15570 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
15580 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
15590 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
155a0 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
155b0 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
155c0 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b  zTo, (void *)pFK
155d0 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  ey.  );.  if( pN
155e0 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a  extTo==pFKey ){.
155f0 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
15600 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f  iled = 1;.    go
15610 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
15620 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
15630 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
15640 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
15650 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
15660 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
15670 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
15680 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
15690 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
156a0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
156b0 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
156c0 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
156d0 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
156e0 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
156f0 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
15700 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15710 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
15720 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
15730 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
15740 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
15750 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
15760 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
15770 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
15780 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
15790 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
157a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
157b0 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
157c0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
157d0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
157e0 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
157f0 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
15800 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
15810 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
15820 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
15830 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
15840 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
15850 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
15860 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
15870 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
15880 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
15890 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
158a0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
158b0 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
158c0 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
158d0 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
158e0 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
158f0 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
15900 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
15910 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
15920 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
15930 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
15940 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
15950 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
15960 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
15970 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
15980 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
15990 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
159a0 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
159b0 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
159c0 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
159d0 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
159e0 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
159f0 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
15a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15a10 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
15a20 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
15a30 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
15a40 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
15a50 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
15a60 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
15a70 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
15a80 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
15a90 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
15aa0 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
15ab0 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
15ac0 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
15ad0 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
15ae0 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
15af0 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
15b00 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
15b10 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
15b20 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
15b30 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
15b40 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
15b50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
15b60 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
15b70 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
15b80 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
15b90 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
15ba0 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
15bb0 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
15bc0 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
15bd0 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
15be0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
15bf0 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
15c00 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
15c10 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
15c20 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
15c30 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
15c40 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
15c50 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
15c60 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
15c70 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
15c80 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
15c90 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
15ca0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
15cb0 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
15cc0 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
15cd0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
15ce0 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
15cf0 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
15d00 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
15d10 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
15d20 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
15d30 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20  .  int iSorter; 
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
15d60 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72  ed by OpenSorter
15d70 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a   (if in use) */.
15d80 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
15db0 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
15dc0 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20  int addr2;      
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15de0 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  * Address to jum
15df0 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74  p to for next it
15e00 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
15e10 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
15e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15e30 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
15e40 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74  x */.  int iPart
15e50 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  IdxLabel;       
15e60 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
15e70 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
15e80 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56  kip a row */.  V
15e90 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15eb0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
15ec0 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
15ed0 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
15ee0 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f00 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
15f10 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  x */.  int regRe
15f20 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
15f30 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
15f40 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62  r holding assemb
15f50 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  led index record
15f60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
15f70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
15f80 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
15f90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15fa0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
15fb0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
15fc0 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
15fd0 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
15fe0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15ff0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
16000 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
16010 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
16020 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
16030 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
16040 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
16050 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  .zName ) ){.    
16060 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
16070 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65  if..  /* Require
16080 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
16090 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65   the table to pe
160a0 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61  rform this opera
160b0 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
160c0 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
160d0 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
160e0 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 1, pTab->zNa
160f0 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  me);..  v = sqli
16100 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16110 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
16120 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d   return;.  if( m
16130 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b  emRootPage>=0 ){
16140 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52  .    tnum = memR
16150 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  ootPage;.  }else
16160 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e  {.    tnum = pIn
16170 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20  dex->tnum;.  }. 
16180 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
16190 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
161a0 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 0a  arse, pIndex);..
161b0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f    /* Open the so
161c0 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20 77  rter cursor if w
161d0 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65  e are to use one
161e0 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d  . */.  iSorter =
161f0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
16200 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16210 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
16220 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20  rOpen, iSorter, 
16230 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  0, pIndex->nKeyC
16240 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20  ol, (char*).    
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
16270 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49  f(pKey), P4_KEYI
16280 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  NFO);..  /* Open
16290 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70   the table. Loop
162a0 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77   through all row
162b0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  s of the table, 
162c0 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a  inserting index.
162d0 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74    ** records int
162e0 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  o the sorter. */
162f0 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
16300 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
16310 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
16320 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
16330 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
16340 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
16350 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56  ind, iTab, 0); V
16360 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16370 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
16380 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16390 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69  pParse);..  sqli
163a0 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
163b0 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65  Key(pParse,pInde
163c0 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64  x,iTab,regRecord
163d0 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65  ,0,&iPartIdxLabe
163e0 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65  l,0,0);.  sqlite
163f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16400 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
16410 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
16420 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
16430 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65  solvePartIdxLabe
16440 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74 49  l(pParse, iPartI
16450 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  dxLabel);.  sqli
16460 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16470 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
16480 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f  addr1+1); VdbeCo
16490 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
164a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
164b0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66  (v, addr1);.  if
164c0 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20  ( memRootPage<0 
164d0 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
164e0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
164f0 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73   tnum, iDb);.  s
16500 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16510 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
16520 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44  , iIdx, tnum, iD
16530 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  b, .            
16540 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29          (char *)
16550 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
16560 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16570 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
16580 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d  AG_BULKCSR|((mem
16590 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46  RootPage>=0)?OPF
165a0 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b  LAG_P2ISREG:0));
165b0 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ..  addr1 = sqli
165c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
165d0 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
165e0 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62  iSorter, 0); Vdb
165f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16600 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20  assert( pKey!=0 
16610 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
16620 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
16630 45 72 72 20 29 3b 0a 20 20 69 66 28 20 49 73 55  Err );.  if( IsU
16640 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
16650 78 29 20 26 26 20 70 4b 65 79 21 3d 30 20 29 7b  x) && pKey!=0 ){
16660 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
16670 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16680 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20  Addr(v) + 3;.   
16690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
166a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
166b0 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32  , j2);.    addr2
166c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
166d0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
166e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
166f0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72  Op4Int(v, OP_Sor
16700 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72  terCompare, iSor
16710 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f  ter, j2, regReco
16720 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
16740 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  dex->nKeyCol); V
16750 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16760 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75      sqlite3Uniqu
16770 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  eConstraint(pPar
16780 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49  se, OE_Abort, pI
16790 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ndex);.  }else{.
167a0 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
167b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
167c0 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr(v);.  }.  sql
167d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
167e0 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
167f0 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
16800 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ord, iIdx);.  sq
16810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16820 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78  v, OP_Last, iIdx
16830 2c 20 30 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69  , 0, -1);.  sqli
16840 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16850 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
16860 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Idx, regRecord, 
16870 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
16880 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
16890 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
168a0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  T);.  sqlite3Rel
168b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
168c0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
168d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
168e0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
168f0 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61  Next, iSorter, a
16900 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72  ddr2); VdbeCover
16910 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
16920 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
16930 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69   addr1);..  sqli
16940 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16950 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29   OP_Close, iTab)
16960 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16970 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
16980 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  e, iIdx);.  sqli
16990 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
169a0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74   OP_Close, iSort
169b0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  er);.}../*.** Al
169c0 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63  locate heap spac
169d0 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64  e to hold an Ind
169e0 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ex object with n
169f0 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a  Col columns..**.
16a00 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
16a10 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
16a20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78  to provide an ex
16a30 74 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73  tra nExtra bytes
16a40 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c  .** of 8-byte al
16a50 69 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65  igned space afte
16a60 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
16a70 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a  ct and return a.
16a80 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
16a90 69 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69  is extra space i
16aa0 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49  n *ppExtra..*/.I
16ab0 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c  ndex *sqlite3All
16ac0 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
16ad0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
16ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
16af0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
16b00 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20  */.  i16 nCol,  
16b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
16b20 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  al number of col
16b30 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
16b40 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  x */.  int nExtr
16b50 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  a,          /* N
16b60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
16b70 66 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f  f extra space to
16b80 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72   alloc */.  char
16b90 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20   **ppExtra      
16ba0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
16bb0 68 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65  he "extra" space
16bc0 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
16bd0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
16be0 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   Allocated index
16bf0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
16c00 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
16c10 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
16c20 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62  ace for Index ob
16c30 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f  ject + arrays */
16c40 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ..  nByte = ROUN
16c50 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  D8(sizeof(Index)
16c60 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
16c70 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
16c80 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ure  */.        
16c90 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
16ca0 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20  char*)*nCol) +  
16cb0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
16cc0 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20  azColl     */.  
16cd0 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
16ce0 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e  izeof(LogEst)*(n
16cf0 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20  Col+1) +     /* 
16d00 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73  Index.aiRowLogEs
16d10 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  t   */.         
16d20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
16d30 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  16)*nCol +      
16d40 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
16d50 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20  iColumn   */.   
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
16d70 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20  zeof(u8)*nCol); 
16d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16d90 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
16da0 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
16db0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
16dc0 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29   nByte + nExtra)
16dd0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
16de0 20 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20   char *pExtra = 
16df0 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44  ((char*)p)+ROUND
16e00 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
16e10 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20  ;.    p->azColl 
16e20 3d 20 28 63 68 61 72 2a 2a 29 70 45 78 74 72 61  = (char**)pExtra
16e30 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b  ;       pExtra +
16e40 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
16e50 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20  char*)*nCol);.  
16e60 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74    p->aiRowLogEst
16e70 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74   = (LogEst*)pExt
16e80 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69  ra; pExtra += si
16e90 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
16ea0 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69  ol+1);.    p->ai
16eb0 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70  Column = (i16*)p
16ec0 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78  Extra;       pEx
16ed0 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
16ee0 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  6)*nCol;.    p->
16ef0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
16f00 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d  *)pExtra;.    p-
16f10 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b  >nColumn = nCol;
16f20 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20  .    p->nKeyCol 
16f30 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  = nCol - 1;.    
16f40 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61  *ppExtra = ((cha
16f50 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20  r*)p) + nByte;. 
16f60 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
16f70 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
16f80 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
16f90 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e  n SQL table.  pN
16fa0 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74  ame1.pName2 is t
16fb0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
16fc0 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62  ndex .** and pTb
16fd0 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d  lList is the nam
16fe0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
16ff0 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
17000 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c  exed.  Both will
17010 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72   .** be NULL for
17020 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
17030 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
17040 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61  is created to sa
17050 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55  tisfy a.** UNIQU
17060 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49  E constraint.  I
17070 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e  f pTable and pIn
17080 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73  dex are NULL, us
17090 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
170a0 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  ble.** as the ta
170b0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
170c0 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  d.  pParse->pNew
170d0 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65  Table is a table
170e0 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72   that is.** curr
170f0 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
17100 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45  tructed by a CRE
17110 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
17120 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ent..**.** pList
17130 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f   is a list of co
17140 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
17150 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c  xed.  pList will
17160 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73   be NULL if this
17170 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79  .** is a primary
17180 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63   key or unique-c
17190 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
171a0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c   most recent col
171b0 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  umn added.** to 
171c0 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
171d0 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
171e0 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  uction.  .**.** 
171f0 49 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  If the index is 
17200 63 72 65 61 74 65 64 20 73 75 63 63 65 73 73 66  created successf
17210 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70  ully, return a p
17220 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
17230 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63  w Index.** struc
17240 74 75 72 65 2e 20 54 68 69 73 20 69 73 20 75 73  ture. This is us
17250 65 64 20 62 79 20 73 71 6c 69 74 65 33 41 64 64  ed by sqlite3Add
17260 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20  PrimaryKey() to 
17270 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a  mark the index.*
17280 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 73 20  * as the tables 
17290 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64  primary key (Ind
172a0 65 78 2e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49  ex.idxType==SQLI
172b0 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
172c0 52 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65 78 20  RYKEY).*/.Index 
172d0 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e  *sqlite3CreateIn
172e0 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50  dex(.  Parse *pP
172f0 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c  arse,     /* All
17300 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
17310 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f  ut this parse */
17320 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
17330 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ,     /* First p
17340 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
17350 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
17360 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
17370 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  2,     /* Second
17380 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
17390 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
173a0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
173b0 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c  TblName, /* Tabl
173c0 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20  e to index. Use 
173d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
173e0 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72  e if 0 */.  Expr
173f0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
17400 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  * A list of colu
17410 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
17420 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  d */.  int onErr
17430 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f  or,       /* OE_
17440 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65  Abort, OE_Ignore
17450 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72  , OE_Replace, or
17460 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f   OE_None */.  To
17470 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20  ken *pStart,    
17480 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74   /* The CREATE t
17490 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73  oken that begins
174a0 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
174b0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68  */.  Expr *pPIWh
174c0 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45  ere,    /* WHERE
174d0 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74   clause for part
174e0 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ial indices */. 
174f0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20   int sortOrder, 
17500 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65      /* Sort orde
17510 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79  r of primary key
17520 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c   when pList==NUL
17530 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74  L */.  int ifNot
17540 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69  Exist     /* Omi
17550 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78  t error if index
17560 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
17570 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
17580 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Ret = 0;     /* 
17590 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72  Pointer to retur
175a0 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
175b0 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ab = 0;     /* T
175c0 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78  able to be index
175d0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
175e0 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20  Index = 0;   /* 
175f0 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20  The index to be 
17600 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61  created */.  cha
17610 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20  r *zName = 0;   
17620 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
17630 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
17640 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
17650 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
17660 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d  aracters in zNam
17670 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  e */.  int i, j;
17680 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
17690 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61          /* For a
176a0 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73  ssigning databas
176b0 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c  e names to pTabl
176c0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  e */.  int sortO
176d0 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31  rderMask;   /* 1
176e0 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69   to honor DESC i
176f0 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69  n index.  0 to i
17700 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  gnore. */.  sqli
17710 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
17720 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b  ->db;.  Db *pDb;
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17740 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62  The specific tab
17750 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
17760 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61  e indexed databa
17770 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17790 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  Index of the dat
177a0 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65  abase that is be
177b0 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ing written */. 
177c0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
177d0 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  0;    /* Unquali
177e0 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
177f0 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65   index to create
17800 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
17810 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73  rList_item *pLis
17820 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f  tItem; /* For lo
17830 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74  oping over pList
17840 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   */.  const Colu
17850 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 20 20 20 20  mn *pTabCol;    
17860 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
17870 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  mn in the table 
17880 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
17890 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
178a0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
178b0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78  llocated for zEx
178c0 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  tra[] */.  int n
178d0 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20  ExtraCol;       
178e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
178f0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
17900 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f  olumns needed */
17910 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20  .  char *zExtra 
17920 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
17930 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
17940 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
17950 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49  ex object */.  I
17960 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
17970 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
17980 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
17990 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
179a0 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  s */..  if( db->
179b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
179c0 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
179d0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
179e0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  0 ){.    goto ex
179f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17a00 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
17a10 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
17a20 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
17a30 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
17a40 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17a50 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
17a60 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
17a70 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
17a80 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
17a90 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
17aa0 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
17ab0 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
17ac0 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
17ad0 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
17ae0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
17af0 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
17b00 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
17b10 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
17b20 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
17b30 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
17b40 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
17b50 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
17b60 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17b70 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
17b80 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
17b90 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
17ba0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
17bb0 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
17bc0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
17bd0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
17be0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
17bf0 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
17c00 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
17c10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17c20 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
17c30 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
17c40 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
17c50 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
17c60 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
17c70 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
17c80 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
17c90 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
17ca0 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
17cb0 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
17cc0 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
17cd0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
17ce0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
17cf0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
17d00 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
17d10 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
17d20 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
17d30 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
17d40 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
17d50 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
17d60 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
17d70 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
17d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
17d90 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
17da0 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
17db0 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
17dc0 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
17dd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
17de0 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
17df0 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
17e00 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
17e10 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
17e20 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
17e30 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
17e40 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
17e50 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
17e60 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
17e70 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
17e80 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
17e90 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
17ea0 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
17eb0 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
17ec0 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
17ed0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
17ee0 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
17ef0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
17f00 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
17f10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17f20 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
17f30 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
17f40 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
17f50 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
17f60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17f70 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
17f80 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
17f90 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
17fa0 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
17fb0 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
17fc0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
17fd0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
17fe0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17ff0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
18000 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
18010 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
18020 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
18030 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
18040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
18050 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
18060 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
18070 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
18080 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
18090 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
180a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
180b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
180c0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
180d0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
180e0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
180f0 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
18100 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
18110 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
18120 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
18130 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
18140 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
18150 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
18160 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
18170 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
18180 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
18190 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
181a0 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
181b0 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
181c0 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
181d0 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  me)==0.#endif.  
181e0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
181f0 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a  trNICmp(&pTab->z
18200 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61  Name[7],"alterta
18210 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20  b_",9)!=0 ){.   
18220 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18230 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
18240 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
18250 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
18260 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
18270 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18280 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
18290 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
182a0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
182b0 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
182c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
182d0 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
182e0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
182f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18300 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
18310 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
18320 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
18330 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
18340 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
18350 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
18360 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
18370 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
18380 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
18390 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
183a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
183b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
183c0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
183d0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
183e0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
183f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
18400 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
18410 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
18420 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
18430 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
18440 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
18450 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
18460 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
18470 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
18480 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
18490 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
184a0 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
184b0 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
184c0 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
184d0 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
184e0 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
184f0 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
18500 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
18510 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
18520 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
18530 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
18540 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
18550 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
18560 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
18570 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
18580 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
18590 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
185a0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
185b0 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
185c0 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
185d0 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
185e0 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
185f0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
18600 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
18610 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
18620 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f  f( zName==0 ) go
18630 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18640 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
18650 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b  ( pName->z!=0 );
18660 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
18670 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
18680 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
18690 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
186a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
186b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
186c0 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
186d0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
186e0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
186f0 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
18700 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
18710 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18720 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
18730 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61   is already a ta
18740 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  ble named %s", z
18750 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67  Name);.        g
18760 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18770 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
18780 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
18790 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
187a0 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e  , zName, pDb->zN
187b0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
187c0 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
187d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
187e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
187f0 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c  se, "index %s al
18800 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a  ready exists", z
18810 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
18820 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
18830 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
18840 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sy );.        sq
18850 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
18860 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
18870 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
18880 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18890 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
188a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
188b0 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
188c0 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
188d0 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
188e0 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
188f0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
18900 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
18910 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
18920 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
18930 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
18940 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
18950 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
18960 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
18970 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18980 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dex;.    }.  }..
18990 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
189a0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
189b0 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
189c0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
189d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
189e0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
189f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
18a00 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
18a10 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
18a20 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18a30 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
18a40 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
18a50 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
18a60 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18a70 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18a80 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
18a90 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
18aa0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
18ab0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
18ac0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
18ad0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
18ae0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
18af0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
18b00 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
18b10 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
18b20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18b30 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18b40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18b50 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
18b60 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
18b70 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
18b80 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
18b90 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
18ba0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
18bb0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
18bc0 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
18bd0 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
18be0 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
18bf0 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
18c00 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
18c10 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
18c20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
18c30 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
18c40 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  arse, 0, 0);.   
18c50 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
18c60 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18c70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73  _index;.    pLis
18c80 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[0].zName = 
18c90 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
18ca0 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cd0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
18ce0 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61  Tab->nCol-1].zNa
18cf0 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  me);.    pList->
18d00 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
18d10 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a   (u8)sortOrder;.
18d20 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
18d30 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79   out how many by
18d40 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65  tes of space are
18d50 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
18d60 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20  re explicitly.  
18d70 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  ** specified col
18d80 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18d90 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  names..  */.  fo
18da0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
18db0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
18dc0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
18dd0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
18de0 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 20  ;.    if( pExpr 
18df0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18e00 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
18e10 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
18e20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73  nExtra += (1 + s
18e30 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
18e40 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29  Expr->u.zToken))
18e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18e60 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
18e70 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
18e80 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
18e90 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
18ea0 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
18eb0 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20  nExtraCol = pPk 
18ec0 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a  ? pPk->nKeyCol :
18ed0 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   1;.  pIndex = s
18ee0 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
18ef0 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c  dexObject(db, pL
18f00 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78  ist->nExpr + nEx
18f10 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  traCol,.        
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e                nN
18f40 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31  ame + nExtra + 1
18f50 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66  , &zExtra);.  if
18f60 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
18f70 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
18f80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18f90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18fa0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
18fb0 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52  MENT(pIndex->aiR
18fc0 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61  owLogEst) );.  a
18fd0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
18fe0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
18ff0 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20  ex->azColl) );. 
19000 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
19010 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72   zExtra;.  zExtr
19020 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a  a += nName + 1;.
19030 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
19040 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
19050 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
19060 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
19070 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
19080 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
19090 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69  r;.  pIndex->uni
190a0 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  qNotNull = onErr
190b0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70  or!=OE_None;.  p
190c0 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d  Index->idxType =
190d0 20 70 4e 61 6d 65 20 3f 20 53 51 4c 49 54 45 5f   pName ? SQLITE_
190e0 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 3a  IDXTYPE_APPDEF :
190f0 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
19100 55 4e 49 51 55 45 3b 0a 20 20 70 49 6e 64 65 78  UNIQUE;.  pIndex
19110 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
19120 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
19130 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ;.  pIndex->nKey
19140 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Col = pList->nEx
19150 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65  pr;.  if( pPIWhe
19160 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  re ){.    sqlite
19170 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
19180 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54  rence(pParse, pT
19190 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20  ab, NC_PartIdx, 
191a0 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  pPIWhere, 0);.  
191b0 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49    pIndex->pPartI
191c0 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65  dxWhere = pPIWhe
191d0 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65  re;.    pPIWhere
191e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
191f0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
19200 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
19210 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  Db, 0) );..  /* 
19220 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
19230 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20  we should honor 
19240 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e  DESC requests on
19250 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20   index columns. 
19260 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70   */.  if( pDb->p
19270 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
19280 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f  mat>=4 ){.    so
19290 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31  rtOrderMask = -1
192a0 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53  ;   /* Honor DES
192b0 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  C */.  }else{.  
192c0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
192d0 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72  = 0;    /* Ignor
192e0 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20  e DESC */.  }.. 
192f0 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
19300 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
19310 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
19320 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
19330 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
19340 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
19350 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
19360 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
19370 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
19380 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
19390 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  ot found..  **. 
193a0 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61   ** TODO:  Add a
193b0 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   test to make su
193c0 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  re that the same
193d0 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e   column is not n
193e0 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74  amed.  ** more t
193f0 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
19400 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
19410 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
19420 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a  instance of.  **
19430 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c   the column will
19440 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79   ever be used by
19450 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20   the optimizer. 
19460 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67   Note that using
19470 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63   the.  ** same c
19480 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20  olumn more than 
19490 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61  once cannot be a
194a0 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
194b0 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  that would .  **
194c0 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73   break backwards
194d0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
194e0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
194f0 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  a warning..  */.
19500 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
19510 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
19520 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
19530 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
19540 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
19550 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69   *zColName = pLi
19560 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  stItem->zName;. 
19570 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64     int requested
19580 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63  SortOrder;.    c
19590 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
195b0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
195c0 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  nce name */..   
195d0 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f   for(j=0, pTabCo
195e0 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c  l=pTab->aCol; j<
195f0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
19600 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
19610 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
19620 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20  rICmp(zColName, 
19630 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d  pTabCol->zName)=
19640 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
19650 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
19660 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
19670 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
19680 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
19690 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e  %s has no column
196a0 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20   named %s",.    
196b0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
196c0 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   zColName);.    
196d0 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
196e0 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
196f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19700 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19710 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78     assert( j<=0x
19720 37 66 66 66 20 29 3b 0a 20 20 20 20 70 49 6e 64  7fff );.    pInd
19730 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
19740 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 69 66  = (i16)j;.    if
19750 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
19760 70 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  pr ){.      int 
19770 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61 73 73  nColl;.      ass
19780 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e  ert( pListItem->
19790 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
197a0 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 7a  LLATE );.      z
197b0 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
197c0 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ->pExpr->u.zToke
197d0 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d  n;.      nColl =
197e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
197f0 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20  (zColl) + 1;.   
19800 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
19810 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  a>=nColl );.    
19820 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
19830 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a   zColl, nColl);.
19840 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
19850 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74  xtra;.      zExt
19860 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra += nColl;.   
19870 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f     nExtra -= nCo
19880 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
19890 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
198a0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
198b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f  ;.      if( !zCo
198c0 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49  ll ) zColl = "BI
198d0 4e 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20 20 20  NARY";.    }.   
198e0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
198f0 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c  usy && !sqlite3L
19900 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
19910 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
19920 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19930 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19940 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61   }.    pIndex->a
19950 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  zColl[i] = zColl
19960 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53  ;.    requestedS
19970 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
19980 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
19990 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  & sortOrderMask;
199a0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f  .    pIndex->aSo
199b0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38  rtOrder[i] = (u8
199c0 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72  )requestedSortOr
199d0 64 65 72 3b 0a 20 20 20 20 69 66 28 20 70 54 61  der;.    if( pTa
199e0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75  b->aCol[j].notNu
199f0 6c 6c 3d 3d 30 20 29 20 70 49 6e 64 65 78 2d 3e  ll==0 ) pIndex->
19a00 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b  uniqNotNull = 0;
19a10 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6b 20 29  .  }.  if( pPk )
19a20 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
19a30 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
19a40 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  ++){.      int x
19a50 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
19a60 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 68  [j];.      if( h
19a70 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d  asColumn(pIndex-
19a80 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65  >aiColumn, pInde
19a90 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29  x->nKeyCol, x) )
19aa0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
19ab0 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20  ->nColumn--; .  
19ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ad0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
19ae0 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20  umn[i] = x;.    
19af0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
19b00 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[i] = pPk->azC
19b10 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
19b20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
19b30 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f  er[i] = pPk->aSo
19b40 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
19b50 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
19b60 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19b70 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  t( i==pIndex->nC
19b80 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65  olumn );.  }else
19b90 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  {.    pIndex->ai
19ba0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 2d 31 3b 0a  Column[i] = -1;.
19bb0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
19bc0 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[i] = "BINARY"
19bd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
19be0 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
19bf0 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
19c00 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
19c10 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
19c20 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
19c30 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
19c40 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
19c50 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
19c60 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
19c70 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
19c80 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
19c90 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
19ca0 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
19cb0 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
19cc0 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
19cd0 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
19ce0 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
19cf0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
19d00 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
19d10 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
19d20 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
19d30 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
19d40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
19d50 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
19d60 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
19d70 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
19d80 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
19d90 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
19da0 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
19db0 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
19dc0 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
19dd0 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
19de0 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
19df0 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
19e00 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
19e10 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
19e20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
19e30 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
19e40 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
19e50 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
19e60 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
19e70 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
19e80 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
19e90 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
19ea0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
19eb0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
19ec0 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
19ed0 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
19ee0 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
19ef0 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
19f00 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
19f10 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
19f20 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
19f30 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
19f40 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
19f50 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
19f60 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
19f70 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
19f80 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
19f90 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
19fa0 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
19fb0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
19fc0 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
19fd0 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
19fe0 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
19ff0 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
1a000 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
1a010 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
1a020 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
1a030 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1a040 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
1a050 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
1a060 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
1a070 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1a080 28 70 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20  (pIdx) );.      
1a090 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64  assert( pIdx->id
1a0a0 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
1a0b0 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a  XTYPE_APPDEF );.
1a0c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73        assert( Is
1a0d0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64  UniqueIndex(pInd
1a0e0 65 78 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  ex) );..      if
1a0f0 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21  ( pIdx->nKeyCol!
1a100 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c  =pIndex->nKeyCol
1a110 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a120 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
1a130 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b  dx->nKeyCol; k++
1a140 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1a150 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20   char *z1;.     
1a160 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1a170 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  2;.        if( p
1a180 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1a190 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  !=pIndex->aiColu
1a1a0 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20  mn[k] ) break;. 
1a1b0 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78         z1 = pIdx
1a1c0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1a1d0 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78       z2 = pIndex
1a1e0 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
1a1f0 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20       if( z1!=z2 
1a200 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1a210 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61  p(z1, z2) ) brea
1a220 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1a230 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b   if( k==pIdx->nK
1a240 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
1a250 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
1a260 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  or!=pIndex->onEr
1a270 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ror ){.         
1a280 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61   /* This constra
1a290 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65 20  int creates the 
1a2a0 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20  same index as a 
1a2b0 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
1a2c0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1a2d0 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77   specified somew
1a2e0 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45 41  here in the CREA
1a2f0 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
1a300 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt..          **
1a310 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20   However the ON 
1a320 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
1a330 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20   are different. 
1a340 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20  If both this .  
1a350 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
1a360 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72  raint and the pr
1a370 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e  evious equivalen
1a380 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76  t constraint hav
1a390 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20  e explicit.     
1a3a0 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c       ** ON CONFL
1a3b0 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69 73  ICT clauses this
1a3c0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74   is an error. Ot
1a3d0 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
1a3e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
1a3f0 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66 69  plicitly specifi
1a400 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20  ed behavior for 
1a410 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  the index..     
1a420 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1a430 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e    if( !(pIdx->on
1a440 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1a450 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  t || pIndex->onE
1a460 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
1a470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1a480 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a490 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1a4a0 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c            "confl
1a4b0 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49  icting ON CONFLI
1a4c0 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69  CT clauses speci
1a4d0 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20  fied", 0);.     
1a4e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a4f0 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72   if( pIdx->onErr
1a500 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29  or==OE_Default )
1a510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  {.            pI
1a520 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49  dx->onError = pI
1a530 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20  ndex->onError;. 
1a540 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52 65     }.        pRe
1a560 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
1a570 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a580 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
1a590 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1a5a0 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
1a5b0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
1a5c0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
1a5d0 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
1a5e0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
1a5f0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
1a600 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
1a610 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
1a620 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
1a630 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1a640 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1a650 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
1a660 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20  chema) );.    p 
1a670 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
1a680 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
1a690 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1a6c0 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29  ->zName, pIndex)
1a6d0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
1a6e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
1a6f0 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
1a700 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
1a710 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64  ailed */.      d
1a720 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a730 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
1a740 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a750 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
1a760 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
1a770 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
1a780 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
1a790 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
1a7a0 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
1a7b0 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
1a7c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1a7d0 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   this is the ini
1a7e0 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45  tial CREATE INDE
1a7f0 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20  X statement (or 
1a800 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66 20  CREATE TABLE if 
1a810 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  the.  ** index i
1a820 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  s an implied ind
1a830 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20  ex for a UNIQUE 
1a840 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1a850 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a  onstraint) then.
1a860 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74    ** emit code t
1a870 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  o allocate the i
1a880 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e  ndex rootpage on
1a890 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61   disk and make a
1a8a0 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  n entry for.  **
1a8b0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68   the index in th
1a8c0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1a8d0 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61  table and popula
1a8e0 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  te the index wit
1a8f0 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  h.  ** content. 
1a900 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20   But, do not do 
1a910 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20 73  this if we are s
1a920 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68  imply reading th
1a930 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
1a940 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61    ** table to pa
1a950 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20  rse the schema, 
1a960 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64 65 78  or if this index
1a970 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59 20   is the PRIMARY 
1a980 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f  KEY index.  ** o
1a990 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  f a WITHOUT ROWI
1a9a0 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  D table..  **.  
1a9b0 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
1a9c0 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
1a9d0 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
1a9e0 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64  ed as an implied
1a9f0 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a   PRIMARY KEY.  *
1aa00 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  * or UNIQUE inde
1aa10 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  x in a CREATE TA
1aa20 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
1aa30 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
1aa40 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
1aa50 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
1aa60 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
1aa70 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
1aa80 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
1aa90 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
1aaa0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
1aab0 73 65 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  se if( pParse->n
1aac0 45 72 72 3d 3d 30 20 26 26 20 28 48 61 73 52 6f  Err==0 && (HasRo
1aad0 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62  wid(pTab) || pTb
1aae0 6c 4e 61 6d 65 21 3d 30 29 20 29 7b 0a 20 20 20  lName!=0) ){.   
1aaf0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
1ab00 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
1ab10 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
1ab20 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76  se->nMem;..    v
1ab30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1ab40 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
1ab50 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
1ab60 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ab70 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ;..    sqlite3Be
1ab80 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1ab90 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1aba0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
1abb0 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
1abc0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  or the index usi
1abd0 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20  ng CreateIndex. 
1abe0 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  But before.    *
1abf0 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65  * doing so, code
1ac00 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74   a Noop instruct
1ac10 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ion and store it
1ac20 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20  s address in .  
1ac30 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e    ** Index.tnum.
1ac40 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1ac50 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69  d in case this i
1ac60 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79  ndex is actually
1ac70 20 61 20 0a 20 20 20 20 2a 2a 20 50 52 49 4d 41   a .    ** PRIMA
1ac80 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65 20 74  RY KEY and the t
1ac90 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79  able is actually
1aca0 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1acb0 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20 20 20   table. In .    
1acc0 2a 2a 20 74 68 61 74 20 63 61 73 65 20 74 68 65  ** that case the
1acd0 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
1ace0 74 52 6f 77 69 64 54 61 62 6c 65 28 29 20 72 6f  tRowidTable() ro
1acf0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61  utine will repla
1ad00 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f  ce.    ** the No
1ad10 6f 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74  op with a Goto t
1ad20 6f 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  o jump over the 
1ad30 56 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61  VDBE code genera
1ad40 74 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20  ted below. */.  
1ad50 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
1ad60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ad70 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(v, OP_Noop);.
1ad80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ad90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
1ada0 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d  teIndex, iDb, iM
1adb0 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74  em);..    /* Gat
1adc0 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
1add0 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
1ade0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1adf0 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  ent into.    ** 
1ae00 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
1ae10 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  le.    */.    if
1ae20 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
1ae30 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28    int n = (int)(
1ae40 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1ae50 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29  en.z - pName->z)
1ae60 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   + pParse->sLast
1ae70 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69  Token.n;.      i
1ae80 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d  f( pName->z[n-1]
1ae90 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20  ==';' ) n--;.   
1aea0 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
1aeb0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
1aec0 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
1aed0 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
1aee0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c       zStmt = sql
1aef0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1af00 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58 20  "CREATE%s INDEX 
1af10 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f  %.*s",.        o
1af20 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20  nError==OE_None 
1af30 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22  ? "" : " UNIQUE"
1af40 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a  , n, pName->z);.
1af50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1af60 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
1af70 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
1af80 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
1af90 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
1afa0 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
1afb0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1afc0 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
1afd0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
1afe0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1aff0 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
1b000 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
1b010 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
1b020 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
1b030 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1b040 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
1b050 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
1b060 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
1b070 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
1b080 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1b090 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
1b0a0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
1b0b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1b0c0 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
1b0d0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1b0e0 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a   iMem,.        z
1b0f0 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
1b100 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b110 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  , zStmt);..    /
1b120 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
1b130 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
1b140 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
1b150 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
1b160 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
1b170 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
1b180 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
1b190 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
1b1a0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
1b1b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
1b1c0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1b1d0 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
1b1e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
1b1f0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1b200 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
1b210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
1b220 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
1b230 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  Db,.         sql
1b240 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1b250 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  "name='%q' AND t
1b260 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49  ype='index'", pI
1b270 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ndex->zName));. 
1b280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b290 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70  AddOp1(v, OP_Exp
1b2a0 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ire, 0);.    }..
1b2b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1b2c0 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64 65  umpHere(v, pInde
1b2d0 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20  x->tnum);.  }.. 
1b2e0 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
1b2f0 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
1b300 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
1b310 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
1b320 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
1b330 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
1b340 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
1b350 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
1b360 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
1b370 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
1b380 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
1b390 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
1b3a0 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
1b3b0 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
1b3c0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
1b3d0 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
1b3e0 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
1b3f0 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
1b400 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
1b410 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
1b420 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
1b430 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
1b440 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
1b450 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
1b460 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
1b470 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
1b480 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1b490 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
1b4a0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1b4b0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1b4c0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
1b4d0 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1b4e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1b4f0 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
1b500 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1b510 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
1b520 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
1b530 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
1b540 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
1b550 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
1b560 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1b570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b580 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1b590 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1b5a0 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
1b5b0 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
1b5c0 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e  }.    pRet = pIn
1b5d0 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
1b5e0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1b5f0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
1b600 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
1b610 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
1b620 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65  f( pIndex ) free
1b630 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1b640 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1b650 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1b660 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1b670 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1b680 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1b690 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1b6a0 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1b6b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b6c0 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
1b6d0 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1b6e0 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1b6f0 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1b700 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1b710 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1b720 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1b730 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1b740 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1b750 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1b760 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1b770 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64  t[0] is supposed
1b780 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1b790 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1b7a0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
1b7b0 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
1b7c0 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
1b7d0 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
1b7e0 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
1b7f0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
1b800 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1b810 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
1b820 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1b830 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
1b840 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
1b850 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1b860 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
1b870 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1b880 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1b890 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
1b8a0 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1b8b0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1b8c0 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1b8d0 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1b8e0 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1b8f0 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1b900 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1b910 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1b920 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1b930 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1b940 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1b950 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1b960 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1b970 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1b980 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1b990 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1b9a0 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1b9b0 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1b9c0 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1b9d0 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1b9e0 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1b9f0 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1ba00 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1ba10 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1ba20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1ba30 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1ba40 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20  x *pIdx){.  /*  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
1ba60 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36  ,  9,  8,  7,  6
1ba70 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61   */.  LogEst aVa
1ba80 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20  l[] = { 33, 32, 
1ba90 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20  30, 28, 26 };.  
1baa0 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78  LogEst *a = pIdx
1bab0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  ->aiRowLogEst;. 
1bac0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1bad0 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29  (ArraySize(aVal)
1bae0 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
1baf0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1bb00 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65   Set the first e
1bb10 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20  ntry (number of 
1bb20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
1bb30 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  x) to the estima
1bb40 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  ted .  ** number
1bb50 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1bb60 74 61 62 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66  table. Or 10, if
1bb70 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
1bb80 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20  umber of rows . 
1bb90 20 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65   ** in the table
1bba0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1bbb0 61 74 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d  at.  */.  a[0] =
1bbc0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
1bbd0 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28  RowLogEst;.  if(
1bbe0 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1bbf0 3d 20 33 33 3b 20 20 20 20 20 20 20 20 61 73 73  = 33;        ass
1bc00 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33  ert( 33==sqlite3
1bc10 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20  LogEst(10) );.. 
1bc20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61   /* Estimate tha
1bc30 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b  t a[1] is 10, a[
1bc40 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73  2] is 9, a[3] is
1bc50 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61   8, a[4] is 7, a
1bc60 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e  [5] is.  ** 6 an
1bc70 64 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  d each subsequen
1bc80 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29  t value (if any)
1bc90 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d   is 5.  */.  mem
1bca0 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c  cpy(&a[1], aVal,
1bcb0 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f   nCopy*sizeof(Lo
1bcc0 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d  gEst));.  for(i=
1bcd0 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78  nCopy+1; i<=pIdx
1bce0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
1bcf0 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20  .    a[i] = 23; 
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73     assert( 23==s
1bd20 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20  qlite3LogEst(5) 
1bd30 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1bd40 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
1bd50 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49  st(1) );.  if( I
1bd60 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1bd70 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65  x) ) a[pIdx->nKe
1bd80 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  yCol] = 0;.}../*
1bd90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bda0 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
1bdb0 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
1bdc0 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
1bdd0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
1bde0 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
1bdf0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
1be00 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
1be10 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1be20 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
1be30 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b  , int ifExists){
1be40 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1be50 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
1be60 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1be70 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1be80 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Db;..  assert( p
1be90 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1bea0 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c  ;   /* Never cal
1beb0 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
1bec0 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
1bed0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1bee0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1bef0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1bf00 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
1bf10 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
1bf20 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1bf30 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1bf40 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
1bf50 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1bf60 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
1bf70 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1bf80 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
1bf90 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
1bfa0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1bfb0 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
1bfc0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ==0 ){.    if( !
1bfd0 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ifExists ){.    
1bfe0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1bff0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1c000 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
1c010 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Name, 0);.    }e
1c020 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1c030 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
1c040 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
1c050 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1c060 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  abase);.    }.  
1c070 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1c080 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
1c090 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1c0a0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
1c0b0 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d  Index->idxType!=
1c0c0 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1c0d0 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c  PPDEF ){.    sql
1c0e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1c0f0 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
1c100 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
1c110 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
1c120 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1c130 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
1c140 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
1c150 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1c160 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
1c170 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1c180 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
1c190 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
1c1a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c1b0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1c1c0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
1c1d0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1c1e0 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
1c1f0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
1c200 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
1c210 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
1c220 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1c230 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1c240 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
1c250 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
1c260 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1c270 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1c280 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
1c290 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
1c2a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1c2b0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1c2c0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1c2d0 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
1c2e0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1c2f0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1c300 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1c310 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
1c320 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
1c330 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1c340 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1c350 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1c360 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1c370 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
1c380 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
1c390 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
1c3a0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
1c3b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
1c3c0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1c3d0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1c3e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1c3f0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1c400 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1c410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
1c420 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1c430 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
1c440 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
1c450 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
1c460 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
1c470 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1c480 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
1c490 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65  ABLE(iDb), pInde
1c4a0 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
1c4b0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
1c4c0 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
1c4d0 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70  e, iDb, "idx", p
1c4e0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Index->zName);. 
1c4f0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1c500 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1c510 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
1c520 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
1c530 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
1c540 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1c550 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1c560 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
1c570 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
1c580 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
1c590 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
1c5a0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1c5b0 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
1c5c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
1c5d0 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
1c5e0 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
1c5f0 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a  bjects. Each obj
1c600 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ect in the.** ar
1c610 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62  ray is szEntry b
1c620 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
1c630 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20  is routine uses 
1c640 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1c650 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20  ().** to extend 
1c660 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61  the array so tha
1c670 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65  t there is space
1c680 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63   for a new objec
1c690 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  t at the end..**
1c6a0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
1c6b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1c6c0 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61  , *pnEntry conta
1c6d0 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ins the current 
1c6e0 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61  size of.** the a
1c6f0 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73  rray (in entries
1c700 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61   - so the alloca
1c710 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74  tion is ((*pnEnt
1c720 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62  ry) * szEntry) b
1c730 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c  ytes.** in total
1c740 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1c750 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63  realloc() is suc
1c760 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66  cessful (i.e. if
1c770 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   no OOM conditio
1c780 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a  n occurs), the.*
1c790 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * space allocate
1c7a0 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62  d for the new ob
1c7b0 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20  ject is zeroed, 
1c7c0 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64  *pnEntry updated
1c7d0 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74   to.** reflect t
1c7e0 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74  he new size of t
1c7f0 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70  he array and a p
1c800 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1c810 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  w allocation.** 
1c820 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20  returned. *pIdx 
1c830 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
1c840 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61  dex of the new a
1c850 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68  rray entry in th
1c860 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f  is case..**.** O
1c870 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1c880 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73   realloc() fails
1c890 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  , *pIdx is set t
1c8a0 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72  o -1, *pnEntry r
1c8b0 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e  emains.** unchan
1c8c0 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  ged and a copy o
1c8d0 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65  f pArray returne
1c8e0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
1c8f0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1c900 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1c910 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1c920 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1c930 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1c940 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72   */.  void *pArr
1c950 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ay,     /* Array
1c960 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69   of objects.  Mi
1c970 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ght be reallocat
1c980 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e  ed */.  int szEn
1c990 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a  try,      /* Siz
1c9a0 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74  e of each object
1c9b0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
1c9c0 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c  .  int *pnEntry,
1c9d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c9e0 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e  f objects curren
1c9f0 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  tly in use */.  
1ca00 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
1ca10 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
1ca20 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
1ca30 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
1ca40 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
1ca50 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69   = *pnEntry;.  i
1ca60 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d  f( (n & (n-1))==
1ca70 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  0 ){.    int sz 
1ca80 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32  = (n==0) ? 1 : 2
1ca90 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e  *n;.    void *pN
1caa0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
1cab0 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79  alloc(db, pArray
1cac0 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20  , sz*szEntry);. 
1cad0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1cae0 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  {.      *pIdx = 
1caf0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1cb00 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20   pArray;.    }. 
1cb10 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
1cb20 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
1cb30 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
1cb40 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74  set(&z[n * szEnt
1cb50 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
1cb60 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20  ;.  *pIdx = n;. 
1cb70 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72   ++*pnEntry;.  r
1cb80 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a  eturn pArray;.}.
1cb90 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1cba0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
1cbb0 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
1cbc0 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
1cbd0 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
1cbe0 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
1cbf0 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
1cc00 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1cc10 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1cc20 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
1cc30 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73  e3IdListAppend(s
1cc40 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
1cc50 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
1cc60 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74   *pToken){.  int
1cc70 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1cc80 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1cc90 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1cca0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1ccb0 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  (IdList) );.    
1ccc0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1ccd0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1cce0 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
1ccf0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1cd00 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
1cd10 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20  pList->a,.      
1cd20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1cd30 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  0]),.      &pLis
1cd40 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69  t->nId,.      &i
1cd50 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
1cd60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
1cd70 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1cd80 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1cd90 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1cda0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1cdb0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1cdc0 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
1cdd0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1cde0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1cdf0 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
1ce00 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
1ce10 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1ce20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1ce30 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1ce40 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1ce50 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1ce60 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1ce70 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1ce80 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1ce90 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1cea0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1ceb0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1cec0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1ced0 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
1cee0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1cef0 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
1cf00 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
1cf10 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
1cf20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
1cf30 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
1cf40 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
1cf50 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
1cf60 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1cf70 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
1cf80 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1cf90 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
1cfa0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1cfb0 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1cfc0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1cfd0 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
1cfe0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1cff0 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1d000 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1d010 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
1d020 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1d030 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
1d040 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
1d050 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
1d060 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
1d070 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
1d080 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
1d090 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
1d0a0 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
1d0b0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1d0c0 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
1d0d0 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
1d0e0 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
1d0f0 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
1d100 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
1d110 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
1d120 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
1d130 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
1d140 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1d150 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
1d160 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
1d170 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
1d180 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
1d190 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
1d1a0 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
1d1b0 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
1d1c0 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
1d1d0 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
1d1e0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
1d1f0 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
1d200 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1d210 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
1d220 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
1d230 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
1d240 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
1d250 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
1d260 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
1d270 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
1d280 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
1d290 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
1d2a0 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
1d2b0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
1d2c0 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
1d2d0 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
1d2e0 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
1d2f0 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1d300 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1d310 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
1d320 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
1d330 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1d340 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
1d350 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
1d360 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1d370 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
1d380 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
1d390 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1d3a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d3b0 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
1d3c0 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
1d3d0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
1d3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d3f0 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
1d400 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
1d410 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1d420 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
1d430 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
1d440 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1d450 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
1d460 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1d470 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
1d480 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1d490 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1d4a0 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
1d4b0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1d4c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
1d4d0 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
1d4e0 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
1d4f0 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
1d500 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1d510 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
1d520 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1d530 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1d540 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
1d550 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1d560 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1d570 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
1d580 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
1d590 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
1d5a0 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
1d5b0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
1d5c0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1d5d0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1d5e0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1d5f0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
1d600 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
1d610 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
1d620 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
1d630 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
1d640 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
1d650 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
1d660 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
1d670 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a  >nAlloc = nGot;.
1d680 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
1d690 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
1d6a0 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
1d6b0 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
1d6c0 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
1d6d0 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
1d6e0 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1d6f0 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
1d700 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
1d710 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
1d720 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
1d730 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78  Src->nSrc += nEx
1d740 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
1d750 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1d760 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
1d770 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
1d780 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
1d790 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
1d7a0 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
1d7b0 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
1d7c0 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
1d7d0 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
1d7e0 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
1d7f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
1d800 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
1d810 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
1d820 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
1d830 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
1d840 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
1d850 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
1d860 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
1d870 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
1d880 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
1d890 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
1d8a0 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
1d8b0 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62  ist even if pTab
1d8c0 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  le is NULL..**.*
1d8d0 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
1d8e0 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1d8f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1d900 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20  OOM error.  The 
1d910 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
1d920 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
1d930 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
1d940 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
1d950 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
1d960 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
1d970 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
1d980 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
1d990 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
1d9a0 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
1d9b0 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
1d9c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d9d0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
1d9e0 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
1d9f0 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
1da00 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
1da10 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
1da20 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
1da30 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
1da40 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
1da50 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
1da60 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
1da70 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
1da80 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
1da90 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
1daa0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
1dab0 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
1dac0 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
1dad0 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
1dae0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
1daf0 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
1db00 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
1db10 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
1db20 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
1db30 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
1db40 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
1db50 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
1db60 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
1db70 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1db80 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
1db90 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
1dba0 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
1dbb0 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
1dbc0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1dbd0 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
1dbe0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1dbf0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1dc00 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
1dc10 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
1dc20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
1dc30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1dc40 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
1dc50 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
1dc60 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1dc70 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1dc80 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1dc90 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
1dca0 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
1dcb0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
1dcc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1dcd0 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
1dce0 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
1dcf0 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
1dd00 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
1dd10 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
1dd20 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
1dd30 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1dd40 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
1dd50 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
1dd60 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
1dd70 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
1dd80 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
1dd90 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
1dda0 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
1ddb0 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
1ddc0 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
1ddd0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1dde0 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
1ddf0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
1de00 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1de10 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1de20 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
1de30 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
1de40 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
1de50 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
1de60 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
1de70 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
1de80 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
1de90 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
1dea0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1deb0 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
1dec0 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
1ded0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
1dee0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1def0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1df00 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c   pDatabase==0 ||
1df10 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f   pTable!=0 );  /
1df20 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20  * Cannot have C 
1df30 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69  without B */.  i
1df40 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1df50 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1df60 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1df70 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  b, sizeof(SrcLis
1df80 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1df90 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1dfa0 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
1dfb0 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lloc = 1;.  }.  
1dfc0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53  pList = sqlite3S
1dfd0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1dfe0 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73  , pList, 1, pLis
1dff0 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28 20  t->nSrc);.  if( 
1e000 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e010 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1e020 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1e030 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1e040 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74  urn 0;.  }.  pIt
1e050 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
1e060 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  List->nSrc-1];. 
1e070 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
1e080 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
1e090 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
1e0a0 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
1e0b0 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ( pDatabase ){. 
1e0c0 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
1e0d0 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
1e0e0 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
1e0f0 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
1e100 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70  = pTemp;.  }.  p
1e110 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
1e120 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1e130 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  en(db, pTable);.
1e140 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
1e150 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
1e160 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
1e170 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75  atabase);.  retu
1e180 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
1e190 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75  ** Assign VdbeCu
1e1a0 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65  rsor index numbe
1e1b0 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
1e1c0 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
1e1d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1e1e0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1e1f0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1e200 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1e210 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1e220 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e230 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1e240 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73  t(pList || pPars
1e250 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1e260 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
1e270 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
1e280 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
1e290 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
1e2a0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1e2b0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1e2c0 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
1e2d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
1e2e0 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
1e2f0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1e300 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
1e310 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
1e320 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1e330 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
1e340 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
1e350 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
1e360 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1e370 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1e380 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
1e390 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
1e3a0 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
1e3b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1e3c0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  rcListDelete(sql
1e3d0 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
1e3e0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1e3f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
1e400 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e410 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1e420 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1e430 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1e440 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
1e450 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1e460 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
1e470 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1e480 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
1e490 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1e4a0 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
1e4b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1e4c0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1e4d0 41 6c 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20  Alias);.    if( 
1e4e0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
1e4f0 78 65 64 42 79 20 29 20 73 71 6c 69 74 65 33 44  xedBy ) sqlite3D
1e500 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1e510 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b  >u1.zIndexedBy);
1e520 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
1e530 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73  fg.isTabFunc ) s
1e540 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
1e550 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1e560 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20  u1.pFuncArg);.  
1e570 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
1e580 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  able(db, pItem->
1e590 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
1e5a0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1e5b0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
1e5c0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1e5d0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
1e5e0 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
1e5f0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1e600 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
1e610 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
1e620 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1e630 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1e640 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e650 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1e660 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
1e670 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
1e680 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
1e690 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
1e6a0 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
1e6b0 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
1e6c0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
1e6d0 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
1e6e0 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
1e6f0 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
1e700 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
1e710 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1e720 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1e730 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
1e740 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
1e750 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
1e760 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
1e770 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
1e780 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1e790 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
1e7a0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
1e7b0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
1e7c0 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
1e7d0 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
1e7e0 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
1e7f0 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
1e800 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
1e810 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
1e820 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
1e830 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
1e840 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
1e850 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
1e860 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1e870 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
1e880 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
1e890 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
1e8a0 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
1e8b0 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
1e8c0 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
1e8d0 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
1e8e0 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
1e8f0 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
1e900 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
1e910 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
1e920 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
1e930 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
1e940 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
1e950 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
1e960 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
1e970 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1e980 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
1e990 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
1e9a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1e9b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1e9c0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1e9d0 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
1e9e0 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
1e9f0 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
1ea00 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
1ea10 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
1ea20 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
1ea30 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1ea40 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
1ea50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ea60 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1ea70 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
1ea80 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1ea90 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1eaa0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
1eab0 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
1eac0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1ead0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
1eae0 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
1eaf0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1eb00 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
1eb10 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
1eb20 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
1eb30 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1eb40 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
1eb50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1eb60 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
1eb70 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
1eb80 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
1eb90 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
1eba0 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1ebb0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1ebc0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1ebd0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1ebe0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1ebf0 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
1ec00 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
1ec10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ec20 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
1ec30 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
1ec40 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
1ec50 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
1ec60 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
1ec70 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
1ec80 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1ec90 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
1eca0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1ecb0 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
1ecc0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
1ecd0 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
1ece0 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20  p->nSrc==0) ){. 
1ecf0 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1ed00 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1ed10 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
1ed20 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73  ->nSrc-1];.  ass
1ed30 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29  ert( pAlias!=0 )
1ed40 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e  ;.  if( pAlias->
1ed50 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
1ed60 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
1ed70 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1ed80 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
1ed90 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1eda0 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
1edb0 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
1edc0 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
1edd0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
1ede0 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f  urn p;.. append_
1edf0 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73  from_error:.  as
1ee00 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
1ee10 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1ee20 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71  e(db, pOn);.  sq
1ee30 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1ee40 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
1ee50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1ee60 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65  lete(db, pSubque
1ee70 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ry);.  return 0;
1ee80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1ee90 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
1eea0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1eeb0 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
1eec0 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
1eed0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
1eee0 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
1eef0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1ef00 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
1ef10 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1ef20 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
1ef30 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1ef40 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
1ef50 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65  dexedBy){.  asse
1ef60 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d  rt( pIndexedBy!=
1ef70 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0 );.  if( p && 
1ef80 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30  ALWAYS(p->nSrc>0
1ef90 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
1efa0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1efb0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1efc0 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
1efd0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f  rt( pItem->fg.no
1efe0 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20  tIndexed==0 );. 
1eff0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1f000 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
1f010 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1f020 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  t( pItem->fg.isT
1f030 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  abFunc==0 );.   
1f040 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d   if( pIndexedBy-
1f050 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78  >n==1 && !pIndex
1f060 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  edBy->z ){.     
1f070 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58   /* A "NOT INDEX
1f080 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73  ED" clause was s
1f090 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72  upplied. See par
1f0a0 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63  se.y .      ** c
1f0b0 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65  onstruct "indexe
1f0c0 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69  d_opt" for detai
1f0d0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  ls. */.      pIt
1f0e0 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
1f0f0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
1f100 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  {.      pItem->u
1f110 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73  1.zIndexedBy = s
1f120 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1f130 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
1f140 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  pIndexedBy);.   
1f150 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49     pItem->fg.isI
1f160 6e 64 65 78 65 64 42 79 20 3d 20 28 70 49 74 65  ndexedBy = (pIte
1f170 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
1f180 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  !=0);.    }.  }.
1f190 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
1f1a0 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   list of functio
1f1b0 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  n arguments to t
1f1c0 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79  he SrcList entry
1f1d0 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d   for a.** table-
1f1e0 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e  valued-function.
1f1f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f200 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28  SrcListFuncArgs(
1f210 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1f220 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c  rcList *p, ExprL
1f230 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1f240 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70  f( p && ALWAYS(p
1f250 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20  ->nSrc>0) ){.   
1f260 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1f270 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1f280 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1f290 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1f2a0 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
1f2b0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1f2c0 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
1f2d0 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
1f2e0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1f2f0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
1f300 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
1f310 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c  u1.pFuncArg = pL
1f320 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  ist;.    pItem->
1f330 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31  fg.isTabFunc = 1
1f340 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
1f350 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
1f360 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
1f370 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
1f380 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
1f390 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
1f3a0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
1f3b0 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
1f3c0 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
1f3d0 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
1f3e0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1f3f0 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
1f400 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
1f410 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
1f420 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
1f430 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
1f440 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
1f450 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
1f460 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
1f470 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
1f480 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
1f490 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1f4a0 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
1f4b0 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
1f4c0 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
1f4d0 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
1f4e0 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
1f4f0 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
1f500 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
1f510 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
1f520 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
1f530 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
1f540 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
1f550 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
1f560 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
1f570 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
1f580 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
1f590 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
1f5a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
1f5b0 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
1f5c0 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
1f5d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1f5e0 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63     for(i=p->nSrc
1f5f0 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
1f600 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66 67 2e       p->a[i].fg.
1f610 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b  jointype = p->a[
1f620 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  i-1].fg.jointype
1f630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
1f640 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [0].fg.jointype 
1f650 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1f660 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
1f670 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
1f680 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
1f690 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1f6a0 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
1f6b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1f6c0 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
1f6d0 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  i;..  assert( pP
1f6e0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20  arse!=0 );.  db 
1f6f0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1f700 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1f710 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  ./*  if( db->aDb
1f720 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
1f730 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71  urn; */.  if( sq
1f740 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1f750 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
1f760 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49  ANSACTION, "BEGI
1f770 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  N", 0, 0) ){.   
1f780 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1f790 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1f7a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1f7b0 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !v ) return;.  
1f7c0 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46  if( type!=TK_DEF
1f7d0 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72  ERRED ){.    for
1f7e0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1f7f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1f800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f810 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
1f820 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45  , i, (type==TK_E
1f830 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20  XCLUSIVE)+1);.  
1f840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
1f850 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a  sesBtree(v, i);.
1f860 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1f870 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f880 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1f890 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
1f8a0 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
1f8b0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1f8c0 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61  ite3CommitTransa
1f8d0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1f8e0 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
1f8f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1f900 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
1f910 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30  t( pParse->db!=0
1f920 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
1f930 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1f940 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1f950 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
1f960 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1f970 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1f980 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1f990 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1f9a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1f9b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1f9c0 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29  utoCommit, 1, 0)
1f9d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1f9e0 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1f9f0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
1fa00 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61  lite3RollbackTra
1fa10 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1fa20 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
1fa30 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *v;..  assert( p
1fa40 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
1fa50 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1fa60 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  !=0 );.  if( sql
1fa70 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1fa80 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1fa90 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
1faa0 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  ACK", 0, 0) ){. 
1fab0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1fac0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1fad0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1fae0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1faf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fb00 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1fb10 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
1fb20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1fb30 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
1fb40 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
1fb50 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
1fb60 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
1fb70 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1fb80 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
1fb90 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
1fba0 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
1fbb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1fbc0 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
1fbd0 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
1fbe0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1fbf0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1fc00 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
1fc10 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
1fc20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
1fc30 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1fc40 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
1fc50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1fc60 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
1fc70 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
1fc80 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
1fc90 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
1fca0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
1fcb0 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
1fcc0 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
1fcd0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1fce0 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
1fcf0 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
1fd00 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1fd10 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
1fd20 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1fd30 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
1fd40 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
1fd50 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
1fd60 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1fd70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
1fd80 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1fd90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1fda0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
1fdb0 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
1fdc0 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
1fdd0 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
1fde0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1fdf0 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
1fe00 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
1fe10 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
1fe20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
1fe30 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
1fe40 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
1fe50 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
1fe60 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1fe70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1fe80 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1fe90 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1fea0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1feb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1fec0 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
1fed0 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
1fee0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1fef0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
1ff00 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
1ff10 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
1ff20 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
1ff30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1ff40 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
1ff50 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
1ff60 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
1ff70 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
1ff80 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
1ff90 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1ffa0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
1ffb0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1ffc0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
1ffd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ffe0 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
1fff0 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c  fs, 0, db, &pBt,
20000 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   0, flags);.    
20010 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20020 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
20030 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20040 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
20050 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
20060 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
20070 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
20080 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
20090 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
200a0 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
200b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
200c0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62     }.    db->aDb
200d0 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  [1].pBt = pBt;. 
200e0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
200f0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
20100 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
20110 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74  NOMEM==sqlite3Bt
20120 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
20130 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  Bt, db->nextPage
20140 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a  size, -1, 0) ){.
20150 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
20160 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
20170 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
20180 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
20190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  ;.}../*.** Recor
201a0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
201b0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
201c0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  e will need to b
201d0 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f  e verified.** fo
201e0 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  r database iDb. 
201f0 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74   The code to act
20200 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65  ually verify the
20210 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a   schema cookie.*
20220 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20  * will occur at 
20230 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
20240 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e  op-level VDBE an
20250 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  d will be genera
20260 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79  ted.** later, by
20270 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
20280 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
20290 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
202a0 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
202b0 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
202c0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
202d0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
202e0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
202f0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
20300 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64  b = pToplevel->d
20310 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  b;..  assert( iD
20320 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
20330 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
20340 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
20350 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
20360 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
20370 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
20380 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72  HED+2 );.  asser
20390 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
203a0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
203b0 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44  b, 0) );.  if( D
203c0 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65  bMaskTest(pTople
203d0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
203e0 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20   iDb)==0 ){.    
203f0 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
20400 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
20410 20 69 44 62 29 3b 0a 20 20 20 20 70 54 6f 70 6c   iDb);.    pTopl
20420 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  evel->cookieValu
20430 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
20440 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
20450 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20  chema_cookie;.  
20460 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
20470 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
20480 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
20490 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54  nTempDatabase(pT
204a0 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  oplevel);.    }.
204b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
204c0 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
204d0 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
204e0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
204f0 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
20500 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
20510 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
20520 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
20530 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
20540 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
20550 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
20560 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
20570 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
20580 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
20590 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
205a0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
205b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
205c0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
205d0 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
205e0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
205f0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
20600 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
20610 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
20620 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  (zDb, pDb->zName
20630 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
20640 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
20650 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
20660 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
20670 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
20680 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
20690 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
206a0 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
206b0 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
206c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
206d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
206e0 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
206f0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
20700 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
20710 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
20720 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
20730 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
20740 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
20750 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
20760 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
20770 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
20780 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
20790 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
207a0 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
207b0 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
207c0 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
207d0 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
207e0 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
207f0 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
20800 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
20810 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
20820 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
20830 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
20840 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
20850 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
20860 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
20870 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
20880 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
20890 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
208a0 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
208b0 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
208c0 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
208d0 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
208e0 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
208f0 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
20900 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
20910 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
20920 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
20930 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
20940 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
20950 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
20960 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
20970 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
20980 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
20990 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
209a0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
209b0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
209c0 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
209d0 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20  vel->writeMask, 
209e0 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
209f0 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
20a00 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
20a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
20a20 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
20a30 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
20a40 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
20a50 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
20a60 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
20a70 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
20a80 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
20a90 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
20aa0 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
20ab0 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
20ac0 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
20ad0 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
20ae0 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
20af0 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
20b00 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
20b10 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
20b20 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
20b30 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
20b40 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
20b50 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
20b60 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
20b70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
20b80 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
20b90 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
20ba0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
20bb0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
20bc0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
20bd0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
20be0 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
20bf0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
20c00 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
20c10 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
20c20 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
20c30 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
20c40 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
20c50 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
20c60 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
20c70 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
20c80 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
20c90 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
20ca0 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
20cb0 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
20cc0 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
20cd0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
20ce0 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
20cf0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
20d00 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
20d10 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
20d20 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
20d30 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
20d40 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
20d50 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
20d60 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
20d70 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
20d80 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
20d90 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
20da0 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
20db0 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
20dc0 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
20dd0 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
20de0 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
20df0 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
20e00 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
20e10 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
20e20 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
20e30 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
20e40 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
20e50 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
20e60 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
20e70 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
20e80 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
20e90 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
20ea0 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
20eb0 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
20ec0 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
20ed0 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
20ee0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
20ef0 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
20f00 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
20f10 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
20f20 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
20f30 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
20f40 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
20f50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20f60 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
20f70 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
20f80 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
20f90 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
20fa0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
20fb0 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
20fc0 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
20fd0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
20fe0 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
20ff0 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
21000 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
21010 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
21020 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
21030 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
21040 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
21050 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
21060 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
21070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21080 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
21090 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
210a0 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
210b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
210c0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
210d0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
210e0 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
210f0 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
21100 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
21110 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
21120 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
21130 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
21140 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
21150 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
21160 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
21170 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
21180 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
21190 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
211a0 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
211b0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
211c0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
211d0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
211e0 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
211f0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
21200 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
21210 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
21220 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
21230 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
21240 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
21250 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
21260 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
21270 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
21280 74 79 70 65 29 3b 0a 20 20 69 66 28 20 70 35 45  type);.  if( p5E
21290 72 72 6d 73 67 20 29 20 73 71 6c 69 74 65 33 56  rrmsg ) sqlite3V
212a0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
212b0 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a  5Errmsg);.}../*.
212c0 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
212d0 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45  lt due to UNIQUE
212e0 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
212f0 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
21300 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
21310 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
21320 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
21330 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
21340 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
21350 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
21360 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69       /* Constrai
21370 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64  nt type */.  Ind
21380 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f  ex *pIdx       /
21390 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74  * The index that
213a0 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f   triggers the co
213b0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20  nstraint */.){. 
213c0 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69   char *zErr;.  i
213d0 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d  nt j;.  StrAccum
213e0 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65   errMsg;.  Table
213f0 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70   *pTab = pIdx->p
21400 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65  Table;..  sqlite
21410 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65  3StrAccumInit(&e
21420 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e 64  rrMsg, pParse->d
21430 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20  b, 0, 0, 200);. 
21440 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
21450 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
21460 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  .    char *zCol 
21470 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64  = pTab->aCol[pId
21480 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e  x->aiColumn[j]].
21490 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6a  zName;.    if( j
214a0 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
214b0 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67  umAppend(&errMsg
214c0 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20  , ", ", 2);.    
214d0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
214e0 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67  ppendAll(&errMsg
214f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
21500 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
21510 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73  cumAppend(&errMs
21520 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20  g, ".", 1);.    
21530 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
21540 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67  ppendAll(&errMsg
21550 2c 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 7a  , zCol);.  }.  z
21560 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Err = sqlite3Str
21570 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72  AccumFinish(&err
21580 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48  Msg);.  sqlite3H
21590 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
215a0 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69  arse, .    IsPri
215b0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
215c0 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  x) ? SQLITE_CONS
215d0 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
215e0 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y .             
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
21600 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
21610 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f  NT_UNIQUE,.    o
21620 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34  nError, zErr, P4
21630 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e  _DYNAMIC, P5_Con
21640 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a  straintUnique);.
21650 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  }.../*.** Code a
21660 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
21670 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
21680 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
21690 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e  e3RowidConstrain
216a0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
216b0 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
216c0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
216d0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
216e0 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
216f0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
21700 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  m */.  Table *pT
21710 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ab       /* The 
21720 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e  table with the n
21730 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20  on-unique rowid 
21740 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  */ .){.  char *z
21750 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Msg;.  int rc;. 
21760 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
21770 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20  >=0 ){.    zMsg 
21780 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
21790 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73  (pParse->db, "%s
217a0 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
217b0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
217d0 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50  b->aCol[pTab->iP
217e0 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Key].zName);.   
217f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
21800 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
21810 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EY;.  }else{.   
21820 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
21830 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
21840 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70  b, "%s.rowid", p
21850 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
21860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
21870 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20  STRAINT_ROWID;. 
21880 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74   }.  sqlite3Halt
21890 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
218a0 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20  e, rc, onError, 
218b0 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
218c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
218d0 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e            P5_Con
218e0 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a  straintUnique);.
218f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
21900 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
21910 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
21920 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
21930 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
21940 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
21950 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
21960 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
21970 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
21980 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
21990 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
219a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
219b0 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
219c0 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  x){.  int i;.  a
219d0 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20  ssert( zColl!=0 
219e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
219f0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pIndex->nColumn;
21a00 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
21a10 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65   char *z = pInde
21a20 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
21a30 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c    assert( z!=0 |
21a40 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  | pIndex->aiColu
21a50 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69  mn[i]<0 );.    i
21a60 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  f( pIndex->aiCol
21a70 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d  umn[i]>=0 && 0==
21a80 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
21a90 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
21aa0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21ab0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
21ac0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
21ad0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
21ae0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20  indices of pTab 
21af0 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c  that use the col
21b00 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
21b10 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f  pColl..** If pCo
21b20 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
21b30 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
21b40 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66   of pTab..*/.#if
21b50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21b60 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
21b70 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c  void reindexTabl
21b80 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
21b90 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68   Table *pTab, ch
21ba0 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
21bb0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
21bc0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
21bd0 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
21be0 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
21bf0 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65   */..  for(pInde
21c00 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
21c10 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
21c20 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  Index->pNext){. 
21c30 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20     if( zColl==0 
21c40 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  || collationMatc
21c50 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29  h(zColl, pIndex)
21c60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
21c70 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
21c80 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
21c90 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
21ca0 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
21cb0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
21cc0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
21cd0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
21ce0 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
21cf0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
21d00 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  -1);.    }.  }.}
21d10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
21d20 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
21d30 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c  ices of all tabl
21d40 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
21d50 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a  ses where the.**
21d60 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65   indices use the
21d70 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
21d80 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70  nce pColl.  If p
21d90 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
21da0 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e  ompute.** all in
21db0 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65  dices everywhere
21dc0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
21dd0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
21de0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
21df0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61  ndexDatabases(Pa
21e00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61  rse *pParse, cha
21e10 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
21e20 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e40 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * A single datab
21e50 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
21e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21e70 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
21e80 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
21e90 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
21ea0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
21eb0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
21ec0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
21ed0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20  .  HashElem *k; 
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ef0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
21f00 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62  er tables in pDb
21f10 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
21f20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
21f30 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
21f40 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
21f50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21f60 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
21f70 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f  utexes(db) );  /
21f80 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68  * Needed for sch
21f90 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20  ema access */.  
21fa0 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64  for(iDb=0, pDb=d
21fb0 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e  b->aDb; iDb<db->
21fc0 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b  nDb; iDb++, pDb+
21fd0 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
21fe0 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  pDb!=0 );.    fo
21ff0 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
22000 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
22010 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
22020 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
22030 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
22040 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
22050 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
22060 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c       reindexTabl
22070 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
22080 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
22090 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
220a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
220b0 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20  for the REINDEX 
220c0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
220d0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20        REINDEX   
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a           -- 1.**
22100 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
22110 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20   <collation>    
22120 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a             -- 2.
22130 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
22140 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
22150 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20  <tablename>  -- 
22160 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  3.**        REIN
22170 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
22180 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d  .?<indexname>  -
22190 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31  - 4.**.** Form 1
221a0 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69   causes all indi
221b0 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63  ces in all attac
221c0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f  hed databases to
221d0 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20   be rebuilt..** 
221e0 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20  Form 2 rebuilds 
221f0 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
22200 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ll databases tha
22210 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a  t use the named.
22220 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ** collating fun
22230 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20  ction.  Forms 3 
22240 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68  and 4 rebuild th
22250 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72  e named index or
22260 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20   all.** indices 
22270 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22280 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e  the named table.
22290 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
222a0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
222b0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e  void sqlite3Rein
222c0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
222d0 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  e, Token *pName1
222e0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29  , Token *pName2)
222f0 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
22300 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
22310 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71  /* Collating seq
22320 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e  uence to be rein
22330 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a  dexed, or NULL *
22340 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22360 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62  /* Name of a tab
22370 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  le or index */. 
22380 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
22390 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
223a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
223b0 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  base */.  Table 
223c0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
223d0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
223e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
223f0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
22400 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
22410 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
22420 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
22430 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  ab */.  int iDb;
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22450 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
22460 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
22470 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
22480 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
22490 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
224a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
224b0 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d    Token *pObjNam
224c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
224d0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
224e0 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62  le or index to b
224f0 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a  e reindexed */..
22500 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
22510 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
22520 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
22530 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
22540 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
22550 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
22560 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
22570 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
22580 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
22590 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
225a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
225b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65    }..  if( pName
225c0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e  1==0 ){.    rein
225d0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
225e0 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rse, 0);.    ret
225f0 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  urn;.  }else if(
22600 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30   NEVER(pName2==0
22610 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d  ) || pName2->z==
22620 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
22630 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  Coll;.    assert
22640 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20  ( pName1->z );. 
22650 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     zColl = sqlit
22660 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
22670 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
22680 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43  e1);.    if( !zC
22690 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  oll ) return;.  
226a0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
226b0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
226c0 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c   ENC(db), zColl,
226d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   0);.    if( pCo
226e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e  ll ){.      rein
226f0 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
22700 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
22710 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
22720 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
22730 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
22740 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
22750 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
22760 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
22770 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
22780 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
22790 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
227a0 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
227b0 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
227c0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
227d0 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
227e0 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
227f0 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
22800 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
22810 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
22820 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
22830 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
22840 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
22850 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
22860 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
22870 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22880 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   z);.    return;
22890 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
228a0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
228b0 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20  (db, z, zDb);.  
228c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
228d0 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , z);.  if( pInd
228e0 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
228f0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
22900 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
22910 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
22920 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
22930 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
22940 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
22950 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
22960 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
22970 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20  ble to identify 
22980 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  the object to be
22990 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a   reindexed");.}.
229a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
229b0 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73  turn a KeyInfo s
229c0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
229d0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
229e0 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78   the given Index
229f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49  ..**.** The KeyI
22a00 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f  nfo structure fo
22a10 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63 61  r an index is ca
22a20 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64 65  ched in the Inde
22a30 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20  x object..** So 
22a40 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 6d  there might be m
22a50 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63  ultiple referenc
22a60 65 73 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e  es to the return
22a70 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68 65  ed pointer.  The
22a80 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
22a90 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64  d not try to mod
22aa0 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ify the KeyInfo 
22ab0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
22ac0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
22ad0 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65  invoke sqlite3Ke
22ae0 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20  yInfoUnref() on 
22af0 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a  the returned obj
22b00 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68  ect.** when it h
22b10 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e  as finished usin
22b20 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  g it..*/.KeyInfo
22b30 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
22b40 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  OfIndex(Parse *p
22b50 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
22b60 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dx){.  int i;.  
22b70 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d  int nCol = pIdx-
22b80 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20  >nColumn;.  int 
22b90 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  nKey = pIdx->nKe
22ba0 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  yCol;.  KeyInfo 
22bb0 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61  *pKey;.  if( pPa
22bc0 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
22bd0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78  rn 0;.  if( pIdx
22be0 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b  ->uniqNotNull ){
22bf0 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69  .    pKey = sqli
22c00 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
22c10 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79  pParse->db, nKey
22c20 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20  , nCol-nKey);.  
22c30 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20  }else{.    pKey 
22c40 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
22c50 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
22c60 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a  , nCol, 0);.  }.
22c70 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
22c80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22c90 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
22ca0 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20  ble(pKey) );.   
22cb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
22cc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
22cd0 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
22ce0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
22cf0 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c     assert( zColl
22d00 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4b 65  !=0 );.      pKe
22d10 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 74  y->aColl[i] = st
22d20 72 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41  rcmp(zColl,"BINA
22d30 52 59 22 29 3d 3d 30 20 3f 20 30 20 3a 0a 20 20  RY")==0 ? 0 :.  
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
22d60 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
22d70 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
22d80 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65   pKey->aSortOrde
22d90 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f  r[i] = pIdx->aSo
22da0 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
22db0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
22dc0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->nErr ){.      
22dd0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
22de0 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ref(pKey);.     
22df0 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d   pKey = 0;.    }
22e00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b  .  }.  return pK
22e10 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ey;.}..#ifndef S
22e20 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
22e30 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
22e40 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  ne is invoked on
22e50 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74 68  ce per CTE by th
22e60 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 70  e parser while p
22e70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54  arsing a .** WIT
22e80 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69  H clause. .*/.Wi
22e90 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41  th *sqlite3WithA
22ea0 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  dd(.  Parse *pPa
22eb0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
22ec0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
22ed0 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74   */.  With *pWit
22ee0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
22ef0 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20 63   Existing WITH c
22f00 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
22f10 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
22f20 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
22f30 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f  ame of the commo
22f40 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  n-table */.  Exp
22f50 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c  rList *pArglist,
22f60 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c       /* Optional
22f70 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73   column name lis
22f80 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  t for the table 
22f90 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75  */.  Select *pQu
22fa0 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ery          /* 
22fb0 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e  Query used to in
22fc0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62  itialize the tab
22fd0 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  le */.){.  sqlit
22fe0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
22ff0 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65  >db;.  With *pNe
23000 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  w;.  char *zName
23010 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
23020 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20  at the CTE name 
23030 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e  is unique within
23040 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75 73   this WITH claus
23050 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20  e. If.  ** not, 
23060 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69  store an error i
23070 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  n the Parse stru
23080 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d  cture. */.  zNam
23090 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
230a0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
230b0 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
230c0 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74  f( zName && pWit
230d0 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
230e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
230f0 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
23100 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
23110 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
23120 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e  , pWith->a[i].zN
23130 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
23140 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23150 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
23160 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c 65  icate WITH table
23170 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d   name: %s", zNam
23180 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
23190 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69  }.  }..  if( pWi
231a0 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  th ){.    int nB
231b0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57  yte = sizeof(*pW
231c0 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70  ith) + (sizeof(p
231d0 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57  With->a[1]) * pW
231e0 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20  ith->nCte);.    
231f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
23200 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74  Realloc(db, pWit
23210 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  h, nByte);.  }el
23220 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  se{.    pNew = s
23230 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
23240 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
23250 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73  With));.  }.  as
23260 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 7c  sert( zName!=0 |
23270 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 61  | pNew==0 );.  a
23280 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
23290 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 4e  cFailed==0 || pN
232a0 65 77 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ew==0 );..  if( 
232b0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
232c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
232d0 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73  lete(db, pArglis
232e0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
232f0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
23300 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
23310 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
23320 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  Name);.    pNew 
23330 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65  = pWith;.  }else
23340 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  {.    pNew->a[pN
23350 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63  ew->nCte].pSelec
23360 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20  t = pQuery;.    
23370 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
23380 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67  te].pCols = pArg
23390 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  list;.    pNew->
233a0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e  a[pNew->nCte].zN
233b0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
233c0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
233d0 43 74 65 5d 2e 7a 45 72 72 20 3d 20 30 3b 0a 20  Cte].zErr = 0;. 
233e0 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b     pNew->nCte++;
233f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
23400 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
23410 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ee the contents 
23420 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  of the With obje
23430 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
23440 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23450 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23460 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69  3WithDelete(sqli
23470 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
23480 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69  With){.  if( pWi
23490 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
234a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
234b0 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
234c0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
234d0 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69  Cte *pCte = &pWi
234e0 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  th->a[i];.      
234f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23500 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
23510 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  pCols);.      sq
23520 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
23530 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  e(db, pCte->pSel
23540 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
23550 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
23560 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
23570 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
23580 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a  ree(db, pWith);.
23590 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
235a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
235b0 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a           OMIT_CTE) */.