/ Hex Artifact Content
Login

Artifact 4a6d573cd5f77812f32d343134b429046946d560:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
10e0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
10f0: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
1100: 2d 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72  ->nested ) retur
1110: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
1120: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1130: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67  .  /* Begin by g
1140: 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74  enerating some t
1150: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20  ermination code 
1160: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1170: 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67  e.  ** vdbe prog
1180: 72 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ram.  */.  v = s
1190: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11a0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
11b0: 20 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74   !pParse->isMult
11c0: 69 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c  iWrite .       |
11d0: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  | sqlite3VdbeAss
11e0: 65 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70  ertMayAbort(v, p
11f0: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
1200: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1210: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1220: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
1230: 70 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73  pcode(v, OP_Clos
1240: 65 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  e) ){}.    sqlit
1250: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1260: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53  OP_Halt);..#if S
1270: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
1280: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66  NTICATION.    if
1290: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  ( pParse->nTable
12a0: 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e  Lock>0 && db->in
12b0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
12c0: 20 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41      sqlite3UserA
12d0: 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20  uthInit(db);.   
12e0: 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e     if( db->auth.
12f0: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
1300: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
1310: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1320: 49 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20  ITE_AUTH_USER;. 
1330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1340: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1350: 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74  user not authent
1360: 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20  icated");.      
1370: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
1380: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
1390: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69      /* The cooki
13a0: 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
13b0: 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  one bit for each
13c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
13d0: 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74  pen..    ** (Bit
13e0: 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20   0 is for main, 
13f0: 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d  bit 1 is for tem
1400: 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  p, and so forth.
1410: 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20  )  Bits are.    
1420: 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  ** set for each 
1430: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
1440: 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65   used.  Generate
1450: 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61   code to start a
1460: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1470: 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64  ion on each used
1480: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f   database and to
1490: 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
14a0: 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a  ma cookie.    **
14b0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
14c0: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
14d0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
14e0: 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20  cFailed==0 .    
14f0: 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65   && (DbMaskNonZe
1500: 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ro(pParse->cooki
1510: 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65  eMask) || pParse
1520: 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20  ->pConstExpr).  
1530: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69    ){.      int i
1540: 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73  Db, i;.      ass
1550: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
1560: 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63  GetOp(v, 0)->opc
1570: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a  ode==OP_Init );.
1580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1590: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b  eJumpHere(v, 0);
15a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30  .      for(iDb=0
15b0: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
15c0: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Db++){.        i
15d0: 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50  f( DbMaskTest(pP
15e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
15f0: 2c 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74  , iDb)==0 ) cont
1600: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
1610: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
1620: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
1630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1640: 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20  ddOp4Int(v,.    
1650: 20 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63        OP_Transac
1660: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
1670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
1680: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  de */.          
1690: 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
16c0: 20 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74        DbMaskTest
16d0: 28 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61  (pParse->writeMa
16e0: 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a  sk,iDb), /* P2 *
16f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  /.          pPar
1700: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
1710: 69 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f  iDb],          /
1720: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P3 */.        
1730: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
1740: 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74  Schema->iGenerat
1750: 69 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ion  /* P4 */.  
1760: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1770: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1780: 73 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  sy==0 ) sqlite3V
1790: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
17a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  );.      }.#ifnd
17b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
17c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
17d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
17e0: 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20  rse->nVtabLock; 
17f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
1800: 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72  ar *vtab = (char
1810: 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61   *)sqlite3GetVTa
1820: 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ble(db, pParse->
1830: 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b 0a  apVtabLock[i]);.
1840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1850: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1860: 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c  VBegin, 0, 0, 0,
1870: 20 76 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b   vtab, P4_VTAB);
1880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1890: 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b  Parse->nVtabLock
18a0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
18b0: 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20      /* Once all 
18c0: 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65  the cookies have
18d0: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61   been verified a
18e0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nd transactions 
18f0: 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a  opened, .      *
1900: 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  * obtain the req
1910: 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b  uired table-lock
1920: 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  s. This is a no-
1930: 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20  op unless the . 
1940: 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63       ** shared-c
1950: 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20  ache feature is 
1960: 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a  enabled..      *
1970: 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c  /.      codeTabl
1980: 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a  eLocks(pParse);.
1990: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
19a0: 6c 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43  lize any AUTOINC
19b0: 52 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75  REMENT data stru
19c0: 63 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e  ctures required.
19d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19e0: 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65  sqlite3Autoincre
19f0: 6d 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65  mentBegin(pParse
1a00: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
1a10: 65 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  e constant expre
1a20: 73 73 69 6f 6e 73 20 74 68 61 74 20 77 68 65 72  ssions that wher
1a30: 65 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 6f  e factored out o
1a40: 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
1a50: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
1a60: 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 29 7b  e->pConstExpr ){
1a70: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
1a80: 74 20 2a 70 45 4c 20 3d 20 70 50 61 72 73 65 2d  t *pEL = pParse-
1a90: 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20  >pConstExpr;.   
1aa0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43       pParse->okC
1ab0: 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 30 3b 0a  onstFactor = 0;.
1ac0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1ad0: 20 69 3c 70 45 4c 2d 3e 6e 45 78 70 72 3b 20 69   i<pEL->nExpr; i
1ae0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
1af0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1b00: 50 61 72 73 65 2c 20 70 45 4c 2d 3e 61 5b 69 5d  Parse, pEL->a[i]
1b10: 2e 70 45 78 70 72 2c 20 70 45 4c 2d 3e 61 5b 69  .pExpr, pEL->a[i
1b20: 5d 2e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ].u.iConstExprRe
1b30: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
1b40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1b50: 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61  Finally, jump ba
1b60: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
1b70: 69 6e 67 20 6f 66 20 74 68 65 20 65 78 65 63 75  ing of the execu
1b80: 74 61 62 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20  table code. */. 
1b90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ba0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1bb0: 6f 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  o, 0, 1);.    }.
1bc0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74    }...  /* Get t
1bd0: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
1be0: 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74  ready for execut
1bf0: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76  ion.  */.  if( v
1c00: 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 72 73   && ALWAYS(pPars
1c10: 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 21  e->nErr==0) && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1d70: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
1d80: 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  sSet = 0;.  }els
1d90: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  e{.    pParse->r
1da0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1db0: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
1dc0: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72  nTab = 0;.  pPar
1dd0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20  se->nMem = 0;.  
1de0: 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30  pParse->nSet = 0
1df0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  ;.  pParse->nVar
1e00: 20 3d 20 30 3b 0a 20 20 44 62 4d 61 73 6b 5a 65   = 0;.  DbMaskZe
1e10: 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ro(pParse->cooki
1e20: 65 4d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMask);.}../*.**
1e30: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
1e40: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1e50: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
1e60: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
1e70: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
1e80: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1e90: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
1ea0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
1eb0: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
1ec0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
1ed0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
1ee0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
1ef0: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
1f00: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
1f10: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
1f20: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
1f30: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
1f40: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
1f50: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
1f60: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
1f70: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
1f80: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
1f90: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
1fa0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
1fb0: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
1fc0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
1fd0: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
1fe0: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
1ff0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
2000: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
2010: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
2020: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
2030: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
2040: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
2050: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
2060: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
2070: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
2080: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
2090: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
20a0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
20b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
20c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
20d0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
20e0: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
20f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2100: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64   pParse->db;.# d
2110: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
2120: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
2130: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
2140: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
2150: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
2160: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2170: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
2180: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
2190: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
21a0: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
21b0: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
21c0: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
21d0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
21e0: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
21f0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
2200: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
2210: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
2220: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
2230: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
2240: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
2250: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
2260: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
2270: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
2280: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
2290: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
22a0: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
22b0: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
22c0: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
22d0: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
22e0: 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Sql, &zErrMsg);.
22f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2300: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
2310: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2320: 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  , zSql);.  memcp
2330: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
2340: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
2350: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
2360: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53  sted--;.}..#if S
2370: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2380: 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  NTICATION./*.** 
2390: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a  Return TRUE if z
23a0: 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d  Table is the nam
23b0: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
23c0: 74 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65  table that store
23d0: 73 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66  s the.** list of
23e0: 20 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72   users and their
23f0: 20 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69   access credenti
2400: 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  als..*/.int sqli
2410: 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65  te3UserAuthTable
2420: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61  (const char *zTa
2430: 62 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ble){.  return s
2440: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2450: 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75  Table, "sqlite_u
2460: 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  ser")==0;.}.#end
2470: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  if../*.** Locate
2480: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2490: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
24a0: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
24b0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
24c0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
24d0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
24e0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
24f0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2500: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2510: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2520: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2530: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
2550: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
2560: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
2570: 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61  rched for the ta
2580: 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66  ble and the.** f
2590: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61  irst matching ta
25a0: 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
25b0: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66    (No checking f
25c0: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62  or duplicate tab
25d0: 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64  le.** names is d
25e0: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
25f0: 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20  h order is TEMP 
2600: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
2610: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75  , then any.** au
2620: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2630: 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68  s added using th
2640: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
2650: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2660: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
2670: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
2680: 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c  *sqlite3FindTabl
2690: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
26a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
26b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
26c0: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
26d0: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
26e0: 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74  i;..  /* All mut
26f0: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
2700: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
2710: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
2720: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
2730: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61  .  assert( zData
2740: 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74  base!=0 || sqlit
2750: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
2760: 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69  utexes(db) );.#i
2770: 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
2780: 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f  THENTICATION.  /
2790: 2a 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e  * Only the admin
27a0: 20 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64   user is allowed
27b0: 20 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   to know that th
27c0: 65 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61  e sqlite_user ta
27d0: 62 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20  ble.  ** exists 
27e0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  */.  if( db->aut
27f0: 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54  h.authLevel<UAUT
2800: 48 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74  H_Admin && sqlit
2810: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2820: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
2830: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
2840: 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d  endif.  for(i=OM
2850: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
2860: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2870: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2880: 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65  i^1 : i;   /* Se
2890: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
28a0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28   MAIN */.    if(
28b0: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26   zDatabase!=0 &&
28c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
28d0: 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61  zDatabase, db->a
28e0: 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63  Db[j].zName) ) c
28f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
2900: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
2910: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
2920: 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d  j, 0) );.    p =
2930: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
2940: 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  (&db->aDb[j].pSc
2950: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
2960: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
2970: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2980: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2990: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
29a0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
29b0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
29c0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
29d0: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
29e0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
29f0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
2a00: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
2a10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
2a20: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
2a30: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2a40: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
2a50: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
2a60: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
2a70: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2a80: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2a90: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2aa0: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2ab0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2ac0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2ad0: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
2ae0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
2af0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2b00: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
2b10: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
2b20: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
2b30: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2b40: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2b50: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
2b60: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2b70: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
2b80: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
2b90: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
2ba0: 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  View,           
2bb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b   /* True if look
2bc0: 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72  ing for a VIEW r
2bd0: 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42  ather than a TAB
2be0: 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LE */.  const ch
2bf0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
2c00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
2c10: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
2c20: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
2c30: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
2c40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2c50: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
2c60: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
2c70: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
2c80: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2c90: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2ca0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2cb0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2cc0: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2cd0: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2ce0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2cf0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
2d00: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
2d10: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
2d20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2d30: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
2d40: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
2d50: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
2d60: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2d70: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2d80: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56  char *zMsg = isV
2d90: 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76  iew ? "no such v
2da0: 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20  iew" : "no such 
2db0: 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20  table";.    if( 
2dc0: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2dd0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2de0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
2df0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
2e00: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
2e10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2e20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2e30: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2e40: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
2e50: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
2e60: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2e70: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53   }.#if SQLITE_US
2e80: 45 52 5f 41 55 54 48 45 4e 49 43 41 54 49 4f 4e  ER_AUTHENICATION
2e90: 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72  .  else if( pPar
2ea0: 73 65 2d 3e 64 62 2d 3e 61 75 74 68 2e 61 75 74  se->db->auth.aut
2eb0: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
2ec0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2ed0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2ee0: 20 22 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65   "user not authe
2ef0: 6e 74 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20  nticated");.    
2f00: 70 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  p = 0;.  }.#endi
2f10: 66 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  f.  return p;.}.
2f20: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
2f30: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
2f40: 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20  ed by *p..**.** 
2f50: 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65  This is a wrappe
2f60: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
2f70: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54  LocateTable(). T
2f80: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2f90: 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  tween.** sqlite3
2fa0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e  LocateTable() an
2fb0: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
2fc0: 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
2fd0: 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a  ction restricts.
2fe0: 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  ** the search to
2ff0: 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68   schema (p->pSch
3000: 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f  ema) if it is no
3010: 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65  t NULL. p->pSche
3020: 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e  ma may be.** non
3030: 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70  -NULL if it is p
3040: 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72  art of a view or
3050: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
3060: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65   definition. See
3070: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72  .** sqlite3FixSr
3080: 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61  cList() for deta
3090: 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ils..*/.Table *s
30a0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
30b0: 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a  eItem(.  Parse *
30c0: 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69  pParse, .  int i
30d0: 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74  sView, .  struct
30e0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
30f0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
3100: 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *zDb;.  assert(
3110: 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c   p->pSchema==0 |
3120: 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  | p->zDatabase==
3130: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  0 );.  if( p->pS
3140: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74  chema ){.    int
3150: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
3160: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
3170: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65  se->db, p->pSche
3180: 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70  ma);.    zDb = p
3190: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
31a0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  Db].zName;.  }el
31b0: 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d  se{.    zDb = p-
31c0: 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a  >zDatabase;.  }.
31d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
31e0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
31f0: 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a  se, isView, p->z
3200: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f  Name, zDb);.}../
3210: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
3220: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
3230: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
3240: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
3250: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
3260: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
3270: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
3280: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
3290: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
32a0: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
32b0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
32c0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
32d0: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
32e0: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
32f0: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
3300: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
3310: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
3320: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
3330: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
3340: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
3350: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
3360: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
3370: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
3380: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
3390: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
33a0: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
33b0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
33c0: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
33d0: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
33e0: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
33f0: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
3400: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
3410: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
3420: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
3430: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
3440: 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d  nt i;.  /* All m
3450: 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69  utexes are requi
3460: 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  red for schema a
3470: 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72  ccess.  Make sur
3480: 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20  e we hold them. 
3490: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62  */.  assert( zDb
34a0: 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  !=0 || sqlite3Bt
34b0: 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
34c0: 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28  es(db) );.  for(
34d0: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
34e0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
34f0: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
3500: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
3510: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
3520: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
3530: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
3540: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  = db->aDb[j].pSc
3550: 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74  hema;.    assert
3560: 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ( pSchema );.   
3570: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
3580: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
3590: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
35a0: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
35b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35c0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
35d0: 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20  (db, j, 0) );.  
35e0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
35f0: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
3600: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b  idxHash, zName);
3610: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
3620: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
3630: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   p;.}../*.** Rec
3640: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
3650: 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
3660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3670: 66 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65  freeIndex(sqlite
3680: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29  3 *db, Index *p)
3690: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
36a0: 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20  _OMIT_ANALYZE.  
36b0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64  sqlite3DeleteInd
36c0: 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29  exSamples(db, p)
36d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
36e0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
36f0: 20 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72   p->pPartIdxWher
3700: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
3710: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41  ree(db, p->zColA
3720: 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73  ff);.  if( p->is
3730: 52 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65  Resized ) sqlite
3740: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
3750: 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53  zColl);.#ifdef S
3760: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
3770: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71  T3_OR_STAT4.  sq
3780: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69  lite3_free(p->ai
3790: 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a  RowEst);.#endif.
37a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
37b0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
37c0: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
37d0: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
37e0: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
37f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
3800: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
3810: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
3820: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
3830: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
3840: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
3850: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
3860: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
3870: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
3880: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
3890: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
38a0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
38b0: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
38c0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
38d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
38e0: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
38f0: 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20  *pIndex;.  Hash 
3900: 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72  *pHash;..  asser
3910: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3920: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
3930: 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68  b, 0) );.  pHash
3940: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
3950: 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  .pSchema->idxHas
3960: 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  h;.  pIndex = sq
3970: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3980: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
3990: 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59   0);.  if( ALWAY
39a0: 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  S(pIndex) ){.   
39b0: 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61   if( pIndex->pTa
39c0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e  ble->pIndex==pIn
39d0: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  dex ){.      pIn
39e0: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
39f0: 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  dex = pIndex->pN
3a00: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
3a10: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
3a20: 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69        /* Justifi
3a30: 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53  cation of ALWAYS
3a40: 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d  ();  The index m
3a50: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69  ust be on the li
3a60: 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69  st of.      ** i
3a70: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20  ndices. */.     
3a80: 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61   p = pIndex->pTa
3a90: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ble->pIndex;.   
3aa0: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
3ab0: 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21  (p) && p->pNext!
3ac0: 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70  =pIndex ){ p = p
3ad0: 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20  ->pNext; }.     
3ae0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26   if( ALWAYS(p &&
3af0: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3b00: 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  x) ){.        p-
3b10: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d  >pNext = pIndex-
3b20: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
3b30: 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e      }.    freeIn
3b40: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3b50: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3b60: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
3b70: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
3b80: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3b90: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3ba0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3bb0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3bc0: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3bd0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3be0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3bf0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3c00: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3c10: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3c20: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3c30: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3c40: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3c50: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3c60: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3c70: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3c80: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3c90: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3ca0: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3cb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3cc0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3cd0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3ce0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3cf0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3d00: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3d10: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
3d20: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3d30: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
3d40: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
3d50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3d60: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
3d70: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3d80: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3d90: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3da0: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3db0: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3dc0: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3dd0: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
3de0: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
3df0: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
3e00: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
3e10: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
3e20: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
3e30: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
3e40: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
3e50: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
3e60: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
3e70: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
3e80: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
3e90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3ea0: 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64   db->aDb);.    d
3eb0: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
3ec0: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
3ed0: 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73  *.** Reset the s
3ee0: 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61  chema for the da
3ef0: 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20  tabase at index 
3f00: 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74  iDb.  Also reset
3f10: 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68   the.** TEMP sch
3f20: 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ema..*/.void sql
3f30: 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65  ite3ResetOneSche
3f40: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
3f50: 69 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20 2a  int iDb){.  Db *
3f60: 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69  pDb;.  assert( i
3f70: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
3f80: 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65 73   /* Case 1:  Res
3f90: 65 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73 63  et the single sc
3fa0: 68 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64 20  hema identified 
3fb0: 62 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62 20  by iDb */.  pDb 
3fc0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
3fd0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3fe0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3ff0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
4000: 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
4010: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
4020: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
4030: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
4040: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 64  ;..  /* If any d
4050: 61 74 61 62 61 73 65 20 6f 74 68 65 72 20 74 68  atabase other th
4060: 61 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65 74  an TEMP is reset
4070: 2c 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73 65  , then also rese
4080: 74 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e 63  t TEMP.  ** sinc
4090: 65 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20  e TEMP might be 
40a0: 68 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73  holding triggers
40b0: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
40c0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20  tables in the.  
40d0: 2a 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ** other databas
40e0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44  e..  */.  if( iD
40f0: 62 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62 20  b!=1 ){.    pDb 
4100: 3d 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20  = &db->aDb[1];. 
4110: 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
4120: 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20  pSchema!=0 );.  
4130: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
4140: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
4150: 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  a);.  }.  return
4160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
4170: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
4180: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c  rmation from all
4190: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
41a0: 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a  ses (including.*
41b0: 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65  * "main" and "te
41c0: 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c  mp") for a singl
41d0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
41e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
41f0: 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
4200: 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
4210: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  n(sqlite3 *db){.
4220: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
4230: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
4240: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
4250: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
4260: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
4270: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
4280: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
4290: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
42a0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
42b0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
42c0: 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  }.  }.  db->flag
42d0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
42e0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
42f0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
4300: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
4310: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
4320: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  db);.  sqlite3Co
4330: 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72  llapseDatabaseAr
4340: 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ray(db);.}../*.*
4350: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4360: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4370: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
4380: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
4390: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
43a0: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
43b0: 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  {.  db->flags &=
43c0: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
43d0: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
43e0: 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61   Delete memory a
43f0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
4400: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
4410: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
4420: 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61   (the.** Table.a
4430: 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f  Col[] array)..*/
4440: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
4450: 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
4460: 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ames(sqlite3 *db
4470: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
4480: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c  {.  int i;.  Col
4490: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73  umn *pCol;.  ass
44a0: 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29  ert( pTable!=0 )
44b0: 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20  ;.  if( (pCol = 
44c0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30  pTable->aCol)!=0
44d0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
44e0: 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b   i<pTable->nCol;
44f0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
4500: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4510: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
4520: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
4530: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4540: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
4550: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4560: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
4570: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
4580: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4590: 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  l->zType);.     
45a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
45b0: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
45c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
45d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
45e0: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
45f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4600: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
4610: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
4620: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
4630: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
4640: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
4650: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
4660: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
4670: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4680: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
4690: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
46a0: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
46b0: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
46c0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
46d0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
46e0: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
46f0: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4700: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
4710: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
4720: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
4730: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4740: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
4750: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
4760: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
4770: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
4780: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
4790: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
47a0: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
47b0: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
47c0: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
47d0: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
47e0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
47f0: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4800: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4810: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4820: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4830: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4840: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4850: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4860: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4870: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4880: 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ect..*/.void sql
4890: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
48a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
48b0: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
48c0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
48d0: 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Next;.  TESTONLY
48e0: 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65  ( int nLookaside
48f0: 3b 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76  ; ) /* Used to v
4900: 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20  erify lookaside 
4910: 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68  not used for sch
4920: 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ema */..  assert
4930: 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61  ( !pTable || pTa
4940: 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  ble->nRef>0 );..
4950: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65    /* Do not dele
4960: 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74  te the table unt
4970: 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  il the reference
4980: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
4990: 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70  ero. */.  if( !p
49a0: 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  Table ) return;.
49b0: 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64    if( ((!db || d
49c0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
49d0: 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65  =0) && (--pTable
49e0: 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74  ->nRef)>0) ) ret
49f0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  urn;..  /* Recor
4a00: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4a10: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b  outstanding look
4a20: 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  aside allocation
4a30: 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c  s in schema Tabl
4a40: 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  es.  ** prior to
4a50: 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28   doing any free(
4a60: 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53  ) operations.  S
4a70: 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c  ince schema Tabl
4a80: 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20  es do not use.  
4a90: 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68  ** lookaside, th
4aa0: 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64  is number should
4ab0: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a   not change. */.
4ac0: 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f    TESTONLY( nLoo
4ad0: 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20  kaside = (db && 
4ae0: 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  (pTable->tabFlag
4af0: 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
4b00: 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b20: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
4b30: 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a  Out : 0 );..  /*
4b40: 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69   Delete all indi
4b50: 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
4b60: 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20  ith this table. 
4b70: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
4b80: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
4b90: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
4ba0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
4bb0: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
4bc0: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
4bd0: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d  pIndex->pSchema=
4be0: 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  =pTable->pSchema
4bf0: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20   );.    if( !db 
4c00: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
4c10: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
4c20: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49  char *zName = pI
4c30: 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20  ndex->zName; .  
4c40: 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49      TESTONLY ( I
4c50: 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73  ndex *pOld = ) s
4c60: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4c70: 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64  (.         &pInd
4c80: 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
4c90: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20  Hash, zName, 0. 
4ca0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
4cb0: 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73  sert( db==0 || s
4cc0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
4cd0: 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e  xHeld(db, 0, pIn
4ce0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  dex->pSchema) );
4cf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4d00: 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70  Old==pIndex || p
4d10: 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Old==0 );.    }.
4d20: 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62      freeIndex(db
4d30: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
4d40: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
4d50: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74  foreign keys att
4d60: 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61  ached to this ta
4d70: 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ble. */.  sqlite
4d80: 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54  3FkDelete(db, pT
4d90: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  able);..  /* Del
4da0: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
4db0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
4dc0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c    */.  sqliteDel
4dd0: 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
4de0: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  b, pTable);.  sq
4df0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4e00: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
4e10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4e20: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c  db, pTable->zCol
4e30: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Aff);.  sqlite3S
4e40: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
4e50: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
4e60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
4e70: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71  _OMIT_CHECK.  sq
4e80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
4e90: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ete(db, pTable->
4ea0: 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a  pCheck);.#endif.
4eb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4ec0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4ed0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c  .  sqlite3VtabCl
4ee0: 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ear(db, pTable);
4ef0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
4f00: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4f10: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  le);..  /* Verif
4f20: 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73  y that no lookas
4f30: 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75  ide memory was u
4f40: 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61  sed by schema ta
4f50: 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  bles */.  assert
4f60: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20  ( nLookaside==0 
4f70: 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64  || nLookaside==d
4f80: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
4f90: 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  t );.}../*.** Un
4fa0: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
4fb0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
4fc0: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
4fd0: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
4fe0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
4ff0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
5000: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
5010: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
5020: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
5030: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
5040: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
5050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
5060: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
5070: 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a  *p;.  Db *pDb;..
5080: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
5090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
50a0: 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
50b0: 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
50c0: 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73  zTabName );.  as
50d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
50e0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
50f0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65   iDb, 0) );.  te
5100: 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65  stcase( zTabName
5110: 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65  [0]==0 );  /* Ze
5120: 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20  ro-length table 
5130: 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  names are allowe
5140: 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62  d */.  pDb = &db
5150: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20  ->aDb[iDb];.  p 
5160: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
5170: 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  ert(&pDb->pSchem
5180: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62  a->tblHash, zTab
5190: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
51a0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
51b0: 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  b, p);.  db->fla
51c0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
51d0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
51e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
51f0: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
5200: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
5210: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
5220: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20   that.** token. 
5230: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
5240: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5250: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
5260: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
5270: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
5280: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
5290: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
52a0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75  on..**.** Any qu
52b0: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65  otation marks (e
52c0: 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d  x:  "name", 'nam
52d0: 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60  e', [name], or `
52e0: 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73  name`) that.** s
52f0: 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79  urround the body
5300: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72   of the token ar
5310: 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  e removed..**.**
5320: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
5330: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
5340: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
5350: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
5360: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
5370: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
5380: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
5390: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
53a0: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
53b0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
53c0: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
53d0: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
53e0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
53f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
5400: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
5410: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
5420: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
5430: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
5440: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
5450: 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  r*)pName->z, pNa
5460: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
5470: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
5480: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5490: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
54a0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
54b0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
54c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
54d0: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
54e0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
54f0: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
5500: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
5510: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
5520: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
5530: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
5540: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
5550: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
5560: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
5570: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
5580: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
5590: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
55a0: 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45   1, SCHEMA_TABLE
55b0: 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  (iDb));.  sqlite
55c0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
55d0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
55e0: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
55f0: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5600: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5610: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
5620: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
5630: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
5640: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
5650: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
5660: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
5670: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5680: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5690: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
56a0: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
56b0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
56c0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
56d0: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
56e0: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
56f0: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5700: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5710: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
5720: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5730: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
5740: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
5750: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5760: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5770: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5780: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5790: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
57a0: 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  pDb;.    int n =
57b0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
57c0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
57d0: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
57e0: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
57f0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
5800: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21  -){.      if( (!
5810: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
5820: 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69  !=1 ) && n==sqli
5830: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d  te3Strlen30(pDb-
5840: 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20  >zName) && .    
5850: 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33        0==sqlite3
5860: 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61  StrICmp(pDb->zNa
5870: 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  me, zName) ){.  
5880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5890: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
58a0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
58b0: 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70  .** The token *p
58c0: 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Name contains th
58d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
58e0: 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61  base (either "ma
58f0: 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22  in" or.** "temp"
5900: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
5910: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
5920: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5930: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64  turns the.** ind
5940: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
5950: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
5960: 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20  aDb[], or -1 if 
5970: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a  the named db .**
5980: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
5990: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
59a0: 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64  indDb(sqlite3 *d
59b0: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
59c0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
59f0: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5a00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65        /* Name we
5a30: 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66   are searching f
5a40: 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  or */.  zName = 
5a50: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5a60: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5a70: 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69  .  i = sqlite3Fi
5a80: 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61  ndDbName(db, zNa
5a90: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5aa0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
5ab0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
5ac0: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
5ad0: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
5ae0: 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74  name is passed t
5af0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
5b00: 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61  ia tokens.** pNa
5b10: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
5b20: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
5b30: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
5b40: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
5b50: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  le:.**.** CREATE
5b60: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
5b70: 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ...);.** .** The
5b80: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5b90: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
5ba0: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
5bb0: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
5bc0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
5bd0: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
5be0: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
5bf0: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5c00: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a  LE yyy(...);.**.
5c10: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5c20: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
5c30: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
5c40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5c50: 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70  ine sets the *pp
5c60: 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74  Unqual pointer t
5c70: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5c80: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5c90: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5ca0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5cb0: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
5cc0: 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66  e.  The index of
5cd0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5ce0: 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e   "xxx" is return
5cf0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5d00: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20  e3TwoPartName(. 
5d10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5d20: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
5d30: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
5d40: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
5d50: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
5d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78       /* The "xxx
5d70: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
5d80: 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22  xx.yyy" or "xxx"
5d90: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
5da0: 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me2,      /* The
5db0: 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61   "yyy" in the na
5dc0: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a  me "xxx.yyy" */.
5dd0: 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61    Token **pUnqua
5de0: 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  l     /* Write t
5df0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f  he unqualified o
5e00: 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20  bject name here 
5e10: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  */.){.  int iDb;
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5e40: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65  holding the obje
5e50: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ct */.  sqlite3 
5e60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
5e70: 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ;..  if( ALWAYS(
5e80: 70 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70 4e  pName2!=0) && pN
5e90: 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  ame2->n>0 ){.   
5ea0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
5eb0: 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c  sy ) {.      sql
5ec0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5ed0: 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61  rse, "corrupt da
5ee0: 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
5ef0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5f00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5f10: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71  .    }.    *pUnq
5f20: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
5f30: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
5f40: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
5f50: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
5f60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5f70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5f80: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
5f90: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
5fa0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
5fb0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
5fc0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
5fd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
5fe0: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
5ff0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
6000: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
6010: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
6020: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
6030: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
6040: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
6050: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6060: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
6070: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
6080: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
6090: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
60a0: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
60b0: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
60c0: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
60d0: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
60e0: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
60f0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
6100: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
6110: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
6120: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
6130: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
6140: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
6150: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
6160: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
6170: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
6180: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
6190: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
61a0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
61b0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
61c0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
61d0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
61e0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
61f0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
6200: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
6210: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
6220: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
6230: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
6240: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
6250: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
6260: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
6270: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
6280: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6290: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
62a0: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
62b0: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
62c0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
62d0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
62e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
62f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6300: 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59  turn the PRIMARY
6310: 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20   KEY index of a 
6320: 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a  table.*/.Index *
6330: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
6340: 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  yIndex(Table *pT
6350: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  ab){.  Index *p;
6360: 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70  .  for(p=pTab->p
6370: 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50  Index; p && !IsP
6380: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
6390: 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  ); p=p->pNext){}
63a0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
63b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
63c0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
63d0: 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65   pIdx that corre
63e0: 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a  sponds to table.
63f0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20  ** column iCol. 
6400: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f   Return -1 if no
6410: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20  t found..*/.i16 
6420: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
6430: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
6440: 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69  , i16 iCol){.  i
6450: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
6460: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
6470: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
6480: 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  iCol==pIdx->aiCo
6490: 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e  lumn[i] ) return
64a0: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
64b0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   -1;.}../*.** Be
64c0: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
64d0: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
64e0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
64f0: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
6500: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
6510: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
6520: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
6530: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
6540: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
6550: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6560: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
6570: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
6580: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
6590: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
65a0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
65b0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
65c0: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
65d0: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
65e0: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
65f0: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
6600: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
6610: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
6620: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
6630: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6640: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
6650: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
6660: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
6670: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
6680: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
6690: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
66a0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
66b0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
66c0: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
66d0: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
66e0: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
66f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
6700: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
6710: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6720: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
6730: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
6740: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
6750: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
6760: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
6770: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
6780: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
6790: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
67a0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
67b0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
67c0: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
67d0: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
67e0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
67f0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
6800: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
6810: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
6820: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
6830: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6840: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
6850: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
6860: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
6870: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
6880: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6890: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
68a0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
68b0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
68c0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
68d0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
68e0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
68f0: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
6900: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
6910: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
6920: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
6930: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6940: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
6950: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
6960: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6970: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
6980: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
6990: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
69a0: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
69b0: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
69c0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
69d0: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
69e0: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
69f0: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
6a00: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
6a10: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6a20: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
6a30: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6a40: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
6a50: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
6a60: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
6a70: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
6a80: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
6a90: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6aa0: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
6ab0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
6ac0: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
6ad0: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
6ae0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
6af0: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
6b00: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
6b10: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
6b20: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
6b30: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
6b40: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
6b50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
6b60: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
6b70: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
6b80: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
6b90: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
6ba0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
6bb0: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
6bc0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
6bd0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
6be0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
6bf0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
6c00: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
6c10: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
6c20: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
6c30: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
6c40: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
6c50: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
6c60: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
6c70: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
6c80: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
6c90: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
6ca0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
6cb0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
6cc0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
6cd0: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
6ce0: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
6cf0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
6d00: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
6d10: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
6d20: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
6d30: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
6d40: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
6d50: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
6d60: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
6d70: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
6d80: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6d90: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6da0: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e   && isTemp && pN
6db0: 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62  ame2->n>0 && iDb
6dc0: 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  !=1 ){.    /* If
6dd0: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
6de0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
6df0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
6e00: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
6e10: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
6e20: 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70  se name is "temp
6e30: 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20  " anyway.  */.  
6e40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6e50: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
6e60: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
6e70: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
6e80: 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ied");.    retur
6e90: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d  n;.  }.  if( !OM
6ea0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
6eb0: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a  emp ) iDb = 1;..
6ec0: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
6ed0: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
6ee0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6ef0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
6f00: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
6f10: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
6f20: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
6f30: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
6f40: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
6f50: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
6f60: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6f70: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
6f80: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
6f90: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
6fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6fb0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
6fc0: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
6fd0: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
6fe0: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
6ff0: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
7000: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
7010: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
7020: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
7030: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
7040: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
7050: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
7060: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
7070: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7080: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7090: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
70a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
70b0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
70c0: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
70d0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
70e0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
70f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7100: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
7110: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
7120: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7130: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
7140: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
7150: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
7160: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
7170: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
7180: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7190: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
71a0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
71b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
71c0: 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20   if( !isVirtual 
71d0: 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  && sqlite3AuthCh
71e0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
71f0: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
7200: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7210: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7230: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
7240: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
7250: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
7260: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
7270: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
7280: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
7290: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
72a0: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
72b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
72c0: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
72d0: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
72e0: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
72f0: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
7300: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
7310: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
7320: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
7330: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
7340: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
7350: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
7360: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
7370: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
7380: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
7390: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
73a0: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
73b0: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
73c0: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
73d0: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
73e0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
73f0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7400: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
7410: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
7420: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7430: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7440: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
7450: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
7460: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
7470: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
7480: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
7490: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
74a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
74b0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
74c0: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
74d0: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
74e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
74f0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
7500: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20  it.busy );.     
7510: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
7520: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
7530: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  e, iDb);.      }
7540: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7550: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7560: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
7570: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
7580: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  , zName, zDb)!=0
7590: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
75a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
75b0: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
75c0: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
75d0: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
75e0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
75f0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7600: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c    }.  }..  pTabl
7610: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
7620: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
7630: 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66  of(Table));.  if
7640: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
7650: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
7660: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  led = 1;.    pPa
7670: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
7680: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72  _NOMEM;.    pPar
7690: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
76a0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
76b0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54  _error;.  }.  pT
76c0: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  able->zName = zN
76d0: 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  ame;.  pTable->i
76e0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
76f0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  ble->pSchema = d
7700: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
7710: 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  ema;.  pTable->n
7720: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c  Ref = 1;.  pTabl
7730: 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  e->nRowLogEst = 
7740: 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
7750: 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
7760: 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 61 73  1048576) );.  as
7770: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
7780: 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  ewTable==0 );.  
7790: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
77a0: 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f  e = pTable;..  /
77b0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
77c0: 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65   magic sqlite_se
77d0: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65  quence table use
77e0: 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65  d by autoincreme
77f0: 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65  nt,.  ** then re
7800: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
7810: 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20  o this table in 
7820: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7830: 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  e structure.  **
7840: 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20   so that INSERT 
7850: 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62  can find the tab
7860: 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a  le easily..  */.
7870: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7880: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
7890: 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  T.  if( !pParse-
78a0: 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d  >nested && strcm
78b0: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
78c0: 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29  _sequence")==0 )
78d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
78e0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
78f0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
7900: 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e   );.    pTable->
7910: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
7920: 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23   = pTable;.  }.#
7930: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69  endif..  /* Begi
7940: 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65  n generating the
7950: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
7960: 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65  insert the table
7970: 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a   record into.  *
7980: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  * the SQLITE_MAS
7990: 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65  TER table.  Note
79a0: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
79b0: 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61  hat we must go a
79c0: 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c  head.  ** and al
79d0: 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72  locate the recor
79e0: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
79f0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77   table entry now
7a00: 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20  .  Before any.  
7a10: 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  ** PRIMARY KEY o
7a20: 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64  r UNIQUE keyword
7a30: 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54  s are parsed.  T
7a40: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69  hose keywords wi
7a50: 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e  ll cause.  ** in
7a60: 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61  dices to be crea
7a70: 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c  ted and the tabl
7a80: 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f  e record must co
7a90: 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  me before the . 
7aa0: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65   ** indices.  He
7ab0: 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20  nce, the record 
7ac0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7ad0: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c  able must be all
7ae0: 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e  ocated.  ** now.
7af0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d  .  */.  if( !db-
7b00: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76  >init.busy && (v
7b10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
7b20: 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b  e(pParse))!=0 ){
7b30: 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20  .    int j1;.   
7b40: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
7b50: 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72  .    int reg1, r
7b60: 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73  eg2, reg3;.    s
7b70: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
7b80: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
7b90: 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 0, iDb);..#ifn
7ba0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7bb0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
7bc0: 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29   if( isVirtual )
7bd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7be0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
7bf0: 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23  VBegin);.    }.#
7c00: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
7c10: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
7c20: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
7c40: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
7c50: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
7c60: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
7c70: 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d    reg1 = pParse-
7c80: 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50  >regRowid = ++pP
7c90: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7ca0: 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg2 = pParse->r
7cb0: 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73  egRoot = ++pPars
7cc0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7cd0: 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  3 = ++pParse->nM
7ce0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
7cf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7d00: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
7d10: 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c   reg3, BTREE_FIL
7d20: 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73  E_FORMAT);.    s
7d30: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
7d40: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
7d50: 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
7d60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
7d70: 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76  , reg3); VdbeCov
7d80: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69  erage(v);.    fi
7d90: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
7da0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
7db0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
7dc0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
7dd0: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
7de0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
7df0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7e00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7e10: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
7e20: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7e30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7e40: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
7e50: 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  iDb, BTREE_FILE_
7e60: 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20  FORMAT, reg3);. 
7e70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7e80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7e90: 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67  er, ENC(db), reg
7ea0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
7eb0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7ec0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
7ed0: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
7ee0: 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  ING, reg3);.    
7ef0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7f00: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20  ere(v, j1);..   
7f10: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
7f20: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
7f30: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
7f40: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
7f50: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
7f60: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
7f70: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
7f80: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
7f90: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
7fa0: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
7fb0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
7fc0: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
7fd0: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
7fe0: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
7ff0: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
8000: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
8010: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
8020: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
8030: 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68  Rowid..    ** Th
8040: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
8050: 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
8060: 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72  ble is left in r
8070: 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  eg pParse->regRo
8080: 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ot..    ** The r
8090: 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61  owid and root pa
80a0: 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73  ge number values
80b0: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
80c0: 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  he code that.   
80d0: 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61   ** sqlite3EndTa
80e0: 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ble will generat
80f0: 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64  e..    */.#if !d
8100: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8110: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
8120: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8130: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
8140: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c     if( isView ||
8150: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
8160: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8170: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
8180: 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20  ger, 0, reg2);. 
8190: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
81a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72      {.      pPar
81b0: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20  se->addrCrTab = 
81c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
81d0: 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  2(v, OP_CreateTa
81e0: 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b  ble, iDb, reg2);
81f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
8200: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
8210: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
8220: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8230: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
8240: 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a  owid, 0, reg1);.
8250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8260: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
8270: 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  , 0, reg3);.    
8280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8290: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
82a0: 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a  0, reg3, reg1);.
82b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
82c0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
82d0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73  G_APPEND);.    s
82e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
82f0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20  (v, OP_Close);. 
8300: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20   }..  /* Normal 
8310: 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75  (non-error) retu
8320: 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  rn. */.  return;
8330: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
8340: 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75  or occurs, we ju
8350: 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e  mp here */.begin
8360: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20  _table_error:.  
8370: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8380: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
8390: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
83a0: 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20  s macro is used 
83b0: 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73  to compare two s
83c0: 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65  trings in a case
83d0: 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e  -insensitive man
83e0: 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c  ner..** It is sl
83f0: 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68  ightly faster th
8400: 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  an calling sqlit
8410: 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65  e3StrICmp() dire
8420: 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f  ctly, but.** pro
8430: 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64  duces larger cod
8440: 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  e..**.** WARNING
8450: 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  : This macro is 
8460: 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77  not compatible w
8470: 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29  ith the strcmp()
8480: 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72   family. It.** r
8490: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
84a0: 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61  he two strings a
84b0: 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77  re equal, otherw
84c0: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64  ise false..*/.#d
84d0: 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c  efine STRICMP(x,
84e0: 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70   y) (\.sqlite3Up
84f0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
8500: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29  igned char *)(x)
8510: 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55  ]==   \.sqlite3U
8520: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
8530: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79  signed char *)(y
8540: 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69  )]     \.&& sqli
8550: 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31  te3StrICmp((x)+1
8560: 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a  ,(y)+1)==0 )../*
8570: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f  .** Add a new co
8580: 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c  lumn to the tabl
8590: 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
85a0: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a  g constructed..*
85b0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
85c0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
85d0: 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ne once for each
85e0: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
85f0: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ion.** in a CREA
8600: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
8610: 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72  nt.  sqlite3Star
8620: 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61  tTable() gets ca
8630: 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f  lled.** first to
8640: 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e   get things goin
8650: 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f  g.  Then this ro
8660: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8670: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75  for each.** colu
8680: 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  mn..*/.void sqli
8690: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  te3AddColumn(Par
86a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
86b0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
86c0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
86d0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c    char *z;.  Col
86e0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
86f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8700: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20  e->db;.  if( (p 
8710: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8720: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
8730: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
8740: 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
8750: 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d  >nCol+1>db->aLim
8760: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8770: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
8780: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8790: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
87a0: 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c   columns on %s",
87b0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
87c0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
87d0: 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  if.  z = sqlite3
87e0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
87f0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
8800: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
8810: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8820: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
8830: 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d  f( STRICMP(z, p-
8840: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20  >aCol[i].zName) 
8850: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8860: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8870: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
8880: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29  mn name: %s", z)
8890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
88a0: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
88b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
88c0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  }.  }.  if( (p->
88d0: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
88e0: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
88f0: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
8900: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
8910: 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e  db,p->aCol,(p->n
8920: 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d  Col+8)*sizeof(p-
8930: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  >aCol[0]));.    
8940: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
8950: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8960: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
8970: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8980: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65     p->aCol = aNe
8990: 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20  w;.  }.  pCol = 
89a0: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
89b0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c  ];.  memset(pCol
89c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  , 0, sizeof(p->a
89d0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c  Col[0]));.  pCol
89e0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20  ->zName = z;. . 
89f0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
8a00: 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65  no type specifie
8a10: 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20  d, columns have 
8a20: 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69  the default affi
8a30: 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27  nity.  ** 'NONE'
8a40: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
8a50: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
8a60: 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43  then sqlite3AddC
8a70: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c  olumnType() will
8a80: 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
8a90: 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c  next to set pCol
8aa0: 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65  ->affinity corre
8ab0: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ctly..  */.  pCo
8ac0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
8ad0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
8ae0: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31   pCol->szEst = 1
8af0: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
8b00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8b10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
8b20: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
8b30: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
8b40: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
8b50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8b60: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
8b70: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
8b80: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
8b90: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
8ba0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
8bb0: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
8bc0: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
8bd0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
8be0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8bf0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8c00: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
8c10: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
8c20: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
8c30: 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72  e *p;.  p = pPar
8c40: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8c50: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8c60: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8c70: 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f  return;.  p->aCo
8c80: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74  l[p->nCol-1].not
8c90: 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72  Null = (u8)onErr
8ca0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  or;.}../*.** Sca
8cb0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
8cc0: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
8cd0: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
8ce0: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
8cf0: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
8d00: 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  y type..**.** Th
8d10: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
8d20: 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  a case-independe
8d30: 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79  nt search of zTy
8d40: 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73  pe for the .** s
8d50: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
8d60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
8d70: 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  . If one of the 
8d80: 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a  substrings is.**
8d90: 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72   found, the corr
8da0: 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69  esponding affini
8db0: 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ty is returned. 
8dc0: 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e  If zType contain
8dd0: 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s.** more than o
8de0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
8df0: 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f  ings, entries to
8e00: 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20  ward the top of 
8e10: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61  .** the table ta
8e20: 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72  ke priority. For
8e30: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79   example, if zTy
8e40: 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c  pe is 'BLOBINT',
8e50: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f   .** SQLITE_AFF_
8e60: 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72  INTEGER is retur
8e70: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74  ned..**.** Subst
8e80: 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e  ring     | Affin
8e90: 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ity.** ---------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27  -------.** 'INT'
8ec0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
8ed0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a  E_AFF_INTEGER.**
8ee0: 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c   'CHAR'        |
8ef0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8f00: 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20  .** 'CLOB'      
8f10: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
8f20: 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20  EXT.** 'TEXT'   
8f30: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8f40: 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27  F_TEXT.** 'BLOB'
8f50: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8f60: 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45  _AFF_NONE.** 'RE
8f70: 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AL'        | SQL
8f80: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
8f90: 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20  'FLOA'        | 
8fa0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
8fb0: 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20  ** 'DOUB'       
8fc0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
8fd0: 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65  AL.**.** If none
8fe0: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
8ff0: 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  gs in the above 
9000: 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c  table are found,
9010: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
9020: 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e  UMERIC is return
9030: 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ed..*/.char sqli
9040: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
9060: 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20   u8 *pszEst){.  
9070: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
9080: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
9090: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
90a0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20  nst char *zChar 
90b0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 3d  = 0;..  if( zIn=
90c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 66 66 3b  =0 ) return aff;
90d0: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d  .  while( zIn[0]
90e0: 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c   ){.    h = (h<<
90f0: 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65  8) + sqlite3Uppe
9100: 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26  rToLower[(*zIn)&
9110: 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  0xff];.    zIn++
9120: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
9130: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
9140: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
9150: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
9160: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
9170: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9180: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68  _TEXT;.      zCh
9190: 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65  ar = zIn;.    }e
91a0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
91b0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
91c0: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
91d0: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
91e0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
91f0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9200: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9210: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
9220: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
9230: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
9240: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
9250: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
9260: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
9270: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
9280: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
9290: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
92a0: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
92b0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
92c0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
92d0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
92e0: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
92f0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9300: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 69  FF_NONE;.      i
9310: 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29  f( zIn[0]=='(' )
9320: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69   zChar = zIn;.#i
9330: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9340: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
9350: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
9360: 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65  ==(('r'<<24)+('e
9370: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
9380: 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'l')          /*
9390: 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20   REAL */.       
93a0: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
93b0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
93c0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
93d0: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
93e0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
93f0: 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  f'<<24)+('l'<<16
9400: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20  )+('o'<<8)+'a') 
9410: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41           /* FLOA
9420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9430: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
9440: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9450: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9460: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
9470: 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32   if( h==(('d'<<2
9480: 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75  4)+('o'<<16)+('u
9490: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
94a0: 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20      /* DOUB */. 
94b0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
94c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
94d0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
94e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
94f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
9500: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
9510: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
9520: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
9530: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
9540: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9550: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
9560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9570: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
9580: 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55  pszEst is not NU
9590: 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74  LL, store an est
95a0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65  imate of the fie
95b0: 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20  ld size.  The.  
95c0: 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73  ** estimate is s
95d0: 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68  caled so that th
95e0: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74  e size of an int
95f0: 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20  eger is 1.  */. 
9600: 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20   if( pszEst ){. 
9610: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20     *pszEst = 1; 
9620: 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a    /* default siz
9630: 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79  e is approx 4 by
9640: 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61  tes */.    if( a
9650: 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ff<SQLITE_AFF_NU
9660: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69  MERIC ){.      i
9670: 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20  f( zChar ){.    
9680: 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72      while( zChar
9690: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [0] ){.         
96a0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69   if( sqlite3Isdi
96b0: 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b  git(zChar[0]) ){
96c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
96d0: 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   v = 0;.        
96e0: 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e      sqlite3GetIn
96f0: 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a  t32(zChar, &v);.
9700: 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d 20              v = 
9710: 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  v/4 + 1;.       
9720: 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20 29       if( v>255 )
9730: 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20   v = 255;.      
9740: 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20        *pszEst = 
9750: 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56  v; /* BLOB(k), V
9760: 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28  ARCHAR(k), CHAR(
9770: 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20  k) -> r=(k/4+1) 
9780: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  */.            b
9790: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
97a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
97b0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
97c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
97d0: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b      *pszEst = 5;
97e0: 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54     /* BLOB, TEXT
97f0: 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28  , CLOB -> r=5  (
9800: 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29  approx 20 bytes)
9810: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
9820: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
9830: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
9840: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
9850: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
9860: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
9870: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
9880: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
9890: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
98a0: 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  e pFirst token i
98b0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74  s the first.** t
98c0: 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75  oken in the sequ
98d0: 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74  ence of tokens t
98e0: 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65  hat describe the
98f0: 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20   type of the.** 
9900: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
9910: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9920: 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20  ion.   pLast is 
9930: 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a  the last token.*
9940: 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  * in the sequenc
9950: 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66  e.  Use this inf
9960: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73  ormation to cons
9970: 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a  truct a string.*
9980: 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  * that contains 
9990: 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20  the typename of 
99a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73  the column and s
99b0: 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67  tore that string
99c0: 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f  .** in zType..*/
99d0: 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64   .void sqlite3Ad
99e0: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73  dColumnType(Pars
99f0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
9a00: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
9a10: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
9a20: 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61  pCol;..  p = pPa
9a30: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
9a40: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
9a50: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
9a60: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
9a70: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
9a80: 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  ol-1];.  assert(
9a90: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20   pCol->zType==0 
9aa0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
9ab0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
9ac0: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
9ad0: 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43  db, pType);.  pC
9ae0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
9af0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
9b00: 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20  pe(pCol->zType, 
9b10: 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d  &pCol->szEst);.}
9b20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ../*.** The expr
9b30: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65  ession is the de
9b40: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
9b50: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9b60: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a  y added column.*
9b70: 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63  * of the table c
9b80: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9b90: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  onstruction..**.
9ba0: 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65  ** Default value
9bb0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73   expressions mus
9bc0: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20  t be constant.  
9bd0: 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69  Raise an excepti
9be0: 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  on if this.** is
9bf0: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a   not the case..*
9c00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9c10: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
9c20: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
9c30: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
9c40: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
9c50: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
9c60: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
9c70: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
9c80: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
9c90: 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53  se, ExprSpan *pS
9ca0: 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  pan){.  Table *p
9cb0: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
9cc0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
9cd0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9ce0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9cf0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d  Table;.  if( p!=
9d00: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20  0 ){.    pCol = 
9d10: 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f  &(p->aCol[p->nCo
9d20: 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  l-1]);.    if( !
9d30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9d40: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
9d50: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62  pSpan->pExpr, db
9d60: 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a  ->init.busy) ){.
9d70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9d80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
9d90: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
9da0: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
9db0: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
9dc0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
9dd0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
9de0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  .      /* A copy
9df0: 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65   of pExpr is use
9e00: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
9e10: 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45   original, as pE
9e20: 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  xpr contains.   
9e30: 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61     ** tokens tha
9e40: 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74  t point to volat
9e50: 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20  ile memory. The 
9e60: 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78  'span' of the ex
9e70: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
9e80: 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  * is required by
9e90: 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e   pragma table_in
9ea0: 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fo..      */.   
9eb0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
9ec0: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
9ed0: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f  Dflt);.      pCo
9ee0: 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74  l->pDflt = sqlit
9ef0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
9f00: 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52  pan->pExpr, EXPR
9f10: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
9f20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9f30: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74  (db, pCol->zDflt
9f40: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  );.      pCol->z
9f50: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Dflt = sqlite3Db
9f60: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
9f70: 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74  r*)pSpan->zStart
9f80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70         (int)(pSp
9fb0: 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e  an->zEnd - pSpan
9fc0: 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20  ->zStart));.    
9fd0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  }.  }.  sqlite3E
9fe0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53  xprDelete(db, pS
9ff0: 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a  pan->pExpr);.}..
a000: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
a010: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a020: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
a030: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
a040: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
a050: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
a060: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
a070: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
a080: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
a090: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
a0a0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
a0b0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
a0c0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
a0d0: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
a0e0: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
a0f0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
a100: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
a110: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
a120: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
a130: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
a140: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
a150: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
a160: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
a170: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a180: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
a190: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
a1a0: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
a1b0: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
a1c0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
a1d0: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
a1e0: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
a1f0: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
a200: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
a210: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
a220: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
a230: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
a240: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a250: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
a260: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
a270: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
a280: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
a290: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
a2a0: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
a2b0: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
a2c0: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
a2d0: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
a2e0: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
a2f0: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
a300: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
a310: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a320: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
a330: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
a340: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
a350: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a360: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
a370: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
a380: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
a390: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
a3a0: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
a3b0: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
a3c0: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
a3d0: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
a3e0: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
a3f0: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
a400: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
a410: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
a420: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
a430: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
a440: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
a450: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
a460: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
a470: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
a480: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
a490: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
a4a0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
a4b0: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
a4c0: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
a4d0: 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
a4e0: 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d  VTAB ) goto prim
a4f0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
a500: 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
a510: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
a520: 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  ryKey ){.    sql
a530: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a540: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62  rse, .      "tab
a550: 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f  le \"%s\" has mo
a560: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
a570: 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e  ary key", pTab->
a580: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
a590: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
a5a0: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74  t;.  }.  pTab->t
a5b0: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61  abFlags |= TF_Ha
a5c0: 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69  sPrimaryKey;.  i
a5d0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
a5e0: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
a5f0: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
a600: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
a610: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a620: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a630: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
a640: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
a650: 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20      nTerm = 1;. 
a660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72   }else{.    nTer
a670: 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  m = pList->nExpr
a680: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a690: 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nTerm; i++){.  
a6a0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
a6b0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
a6c0: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
a6d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a6e0: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
a6f0: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
a700: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
a710: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a720: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a730: 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  .colFlags |= COL
a740: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20  FLAG_PRIMKEY;.  
a750: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
a760: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a770: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
a780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a790: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
a7a0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d  .  }.  if( nTerm
a7b0: 3d 3d 31 0a 20 20 20 26 26 20 7a 54 79 70 65 20  ==1.   && zType 
a7c0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
a7d0: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
a7e0: 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72  R")==0.   && sor
a7f0: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
a800: 4f 5f 41 53 43 0a 20 20 29 7b 0a 20 20 20 20 70  O_ASC.  ){.    p
a810: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
a820: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
a830: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
a840: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
a850: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
a860: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
a870: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
a880: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
a890: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20  oincrement;.    
a8a0: 69 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72  if( pList ) pPar
a8b0: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
a8c0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73   = pList->a[0].s
a8d0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73  ortOrder;.  }els
a8e0: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
a8f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a900: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
a910: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
a920: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a930: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
a940: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
a950: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
a960: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a970: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
a980: 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  lse{.    Vdbe *v
a990: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a9a0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  ;.    Index *p;.
a9b0: 20 20 20 20 69 66 28 20 76 20 29 20 70 50 61 72      if( v ) pPar
a9c0: 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 3d  se->addrSkipPK =
a9d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a9e0: 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(v, OP_Noop);.
a9f0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43      p = sqlite3C
aa00: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
aa10: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
aa20: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20  t, onError, 0,. 
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72            0, sor
aa50: 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20  tOrder, 0);.    
aa60: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
aa70: 2d 3e 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49  ->idxType = SQLI
aa80: 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
aa90: 52 59 4b 45 59 3b 0a 20 20 20 20 20 20 69 66 28  RYKEY;.      if(
aaa0: 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   v ) sqlite3Vdbe
aab0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72  JumpHere(v, pPar
aac0: 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 3b  se->addrSkipPK);
aad0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
aae0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
aaf0: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
ab00: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
ab10: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
ab20: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
ab30: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  n;.}../*.** Add 
ab40: 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73  a new CHECK cons
ab50: 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61  traint to the ta
ab60: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
ab70: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
ab80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ab90: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  3AddCheckConstra
aba0: 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
abb0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
abc0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
abd0: 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70   Expr *pCheckExp
abe0: 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20  r  /* The check 
abf0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
ac00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ac10: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62  OMIT_CHECK.  Tab
ac20: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
ac30: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
ac40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ac50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
ac60: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
ac70: 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21  ARE_VTAB.   && !
ac80: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65  sqlite3BtreeIsRe
ac90: 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64  adonly(db->aDb[d
aca0: 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74  b->init.iDb].pBt
acb0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ).  ){.    pTab-
acc0: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
acd0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
ace0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
acf0: 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72  heck, pCheckExpr
ad00: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
ad10: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
ad20: 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e.n ){.      sql
ad30: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
ad40: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ame(pParse, pTab
ad50: 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73  ->pCheck, &pPars
ad60: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
ad70: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 1);.    }.  }
ad80: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
ad90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
ada0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
adb0: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
adc0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
add0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
ade0: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
adf0: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
ae00: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
ae10: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
ae20: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
ae30: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
ae40: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
ae50: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
ae60: 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ken){.  Table *p
ae70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
ae80: 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
ae90: 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74         /* Dequot
aea0: 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  ed name of colla
aeb0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
aec0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
aed0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
aee0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
aef0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
af00: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64  = p->nCol-1;.  d
af10: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
af20: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
af30: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
af40: 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
af50: 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
af60: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
af70: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
af80: 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
af90: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
afa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
afb0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b  ree(db, p->aCol[
afc0: 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70  i].zColl);.    p
afd0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20  ->aCol[i].zColl 
afe0: 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20  = zColl;.  .    
aff0: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
b000: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
b010: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
b020: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
b030: 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  e>",.    ** then
b040: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
b050: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
b060: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
b070: 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
b080: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
b090: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
b0a0: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
b0b0: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a   the case..    *
b0c0: 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  /.    for(pIdx=p
b0d0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
b0e0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
b0f0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b100: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
b110: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
b120: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
b130: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==i ){.        p
b140: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d  Idx->azColl[0] =
b150: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b160: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b170: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b180: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b190: 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zColl);.  }.}../
b1a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b1b0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
b1c0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b1d0: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
b1e0: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
b1f0: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
b200: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
b210: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
b220: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
b230: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
b240: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
b250: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
b260: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
b270: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
b280: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
b290: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
b2a0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
b2b0: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
b2c0: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
b2d0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b2e0: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
b2f0: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
b300: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
b310: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
b320: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
b330: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
b340: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
b350: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
b360: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
b370: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
b380: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
b390: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
b3a0: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
b3b0: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
b3c0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
b3d0: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
b3e0: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
b3f0: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
b400: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
b410: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
b420: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
b430: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
b440: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
b450: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
b460: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
b470: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
b480: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
b490: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
b4a0: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
b4b0: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  message..**.** S
b4c0: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
b4d0: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73  FindCollSeq(), s
b4e0: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
b4f0: 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  ().*/.CollSeq *s
b500: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b510: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
b520: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
b530: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
b540: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b550: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  b;.  u8 enc = EN
b560: 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74  C(db);.  u8 init
b570: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
b580: 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  busy;.  CollSeq 
b590: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
b5a0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
b5b0: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a  llSeq(db, enc, z
b5c0: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
b5d0: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
b5e0: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
b5f0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
b600: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
b610: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
b620: 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c  arse, enc, pColl
b630: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  , zName);.  }.. 
b640: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
b650: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
b660: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
b670: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
b680: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
b690: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
b6a0: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
b6b0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
b6c0: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
b6d0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
b6e0: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
b6f0: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
b700: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
b710: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
b720: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
b730: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
b740: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
b750: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
b760: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
b770: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
b780: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
b790: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
b7a0: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
b7b0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
b7c0: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
b7d0: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
b7e0: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
b7f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
b800: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
b810: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
b820: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
b830: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
b840: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
b850: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
b860: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
b870: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
b880: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
b890: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
b8a0: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
b8b0: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
b8c0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
b8d0: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
b8e0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
b8f0: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
b900: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
b910: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
b920: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b930: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
b940: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
b950: 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  iDb){.  int r1 =
b960: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b970: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
b980: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b990: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
b9a0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
b9b0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
b9c0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
b9d0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
b9e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b9f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
ba00: 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44  eger, db->aDb[iD
ba10: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
ba20: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29  ma_cookie+1, r1)
ba30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
ba40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
ba50: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
ba60: 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  E_SCHEMA_VERSION
ba70: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
ba80: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
ba90: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
baa0: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
bab0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
bac0: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
bad0: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
bae0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
baf0: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
bb00: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
bb10: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
bb20: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
bb30: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
bb40: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
bb50: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
bb60: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
bb70: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
bb80: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
bb90: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
bba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bbb0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
bbc0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
bbd0: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
bbe0: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
bbf0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
bc00: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
bc10: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
bc20: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
bc30: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
bc40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
bc50: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20  put buffer. The 
bc60: 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d  second .** param
bc70: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
bc80: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
bc90: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
bca0: 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77  e offset at.** w
bcb0: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e  hich to write in
bcc0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
bcd0: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
bce0: 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a  ion copies the.*
bcf0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
bd00: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
bd10: 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20  to by the third 
bd20: 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e  parameter, zSign
bd30: 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74  edIdent,.** to t
bd40: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66  he specified off
bd50: 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  set in the buffe
bd60: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70  r and updates *p
bd70: 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  Idx to refer.** 
bd80: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
bd90: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
bda0: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65   byte written be
bdb0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
bdc0: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ** .** If the st
bdd0: 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e  ring zSignedIden
bde0: 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  t consists entir
bdf0: 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d  ely of alpha-num
be00: 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65  eric.** characte
be10: 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  rs, does not beg
be20: 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20  in with a digit 
be30: 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  and is not an SQ
be40: 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68  L keyword,.** th
be50: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
be60: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
be70: 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ffer exactly as 
be80: 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65  it is. Otherwise
be90: 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65  ,.** it is quote
bea0: 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71  d using double-q
beb0: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
bec0: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
bed0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
bee0: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
bef0: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
bf00: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
bf10: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
bf20: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
bf30: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
bf40: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
bf50: 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  dx;..  for(j=0; 
bf60: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
bf70: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
bf80: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
bf90: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
bfa0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
bfb0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
bfc0: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
bfd0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
bfe0: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
bff0: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
c000: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20  ent, j)!=TK_ID. 
c010: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49             || zI
c020: 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20  dent[j]!=0.     
c030: 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a         || j==0;.
c040: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c050: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c060: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
c070: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
c080: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
c090: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
c0a0: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
c0b0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
c0c0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
c0d0: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
c0e0: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
c0f0: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
c100: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
c110: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
c120: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
c130: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
c140: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
c150: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
c160: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
c170: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
c180: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
c190: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
c1a0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
c1b0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
c1c0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c1d0: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
c1e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
c1f0: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
c200: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
c210: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
c220: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
c230: 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  d;.  Column *pCo
c240: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
c250: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
c260: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
c270: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c280: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
c290: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
c2a0: 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b  ) + 5;.  }.  n +
c2b0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
c2c0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
c2d0: 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70  <50 ){ .    zSep
c2e0: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
c2f0: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
c300: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
c310: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
c320: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
c330: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
c340: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
c350: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
c360: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
c370: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c380: 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  aw(0, n);.  if( 
c390: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
c3a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c3b0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
c3c0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
c3d0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
c3e0: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
c3f0: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
c400: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
c410: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
c420: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
c430: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
c440: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
c450: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
c460: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
c470: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
c480: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c490: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
c4a0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
c4b0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
c4c0: 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  E    */ "",.    
c4d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
c4e0: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
c4f0: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
c500: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
c510: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
c520: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c530: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
c540: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
c550: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
c560: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
c570: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
c580: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
c590: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
c5a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c5b0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
c5c0: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
c5d0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c5e0: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
c5f0: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
c600: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
c610: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
c620: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
c630: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c640: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  -SQLITE_AFF_NONE
c650: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
c660: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
c670: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ity-SQLITE_AFF_N
c680: 4f 4e 45 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ONE < ArraySize(
c690: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
c6a0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c6b0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c6c0: 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20  AFF_NONE );.    
c6d0: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c6e0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c6f0: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
c700: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c710: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c720: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
c730: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c740: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c750: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c760: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
c770: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c780: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
c790: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
c7a0: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
c7b0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
c7c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 5d 3b  QLITE_AFF_NONE];
c7d0: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
c7e0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
c7f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c800: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c810: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a  QLITE_AFF_NONE .
c820: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
c830: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
c840: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
c850: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
c860: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
c870: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
c880: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
c890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
c8a0: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
c8b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
c8c0: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
c8d0: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
c8e0: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
c8f0: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
c900: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
c910: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
c920: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
c930: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
c940: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
c950: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
c960: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
c970: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
c980: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
c990: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
c9a0: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
c9b0: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
c9c0: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
c9d0: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
c9e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c9f0: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
ca00: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
ca10: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
ca20: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
ca30: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
ca40: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
ca50: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
ca60: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
ca70: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
ca80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ca90: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
caa0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69  pIdx->azColl, si
cab0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78  zeof(char*)*pIdx
cac0: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
cad0: 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68  dx->azColl = (ch
cae0: 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  ar**)zExtra;.  z
caf0: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
cb00: 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63  char*)*N;.  memc
cb10: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
cb20: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f  >aiColumn, sizeo
cb30: 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f  f(i16)*pIdx->nCo
cb40: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
cb50: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
cb60: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
cb70: 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
cb80: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
cb90: 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ra, pIdx->aSortO
cba0: 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  rder, pIdx->nCol
cbb0: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn);.  pIdx->aS
cbc0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
cbd0: 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e  zExtra;.  pIdx->
cbe0: 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70  nColumn = N;.  p
cbf0: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d  Idx->isResized =
cc00: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
cc10: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cc20: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f   Estimate the to
cc30: 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f  tal row width fo
cc40: 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  r a table..*/.st
cc50: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
cc60: 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62  teTableWidth(Tab
cc70: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73  le *pTab){.  uns
cc80: 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30  igned wTable = 0
cc90: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
cca0: 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74   *pTabCol;.  int
ccb0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62   i;.  for(i=pTab
ccc0: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d  ->nCol, pTabCol=
ccd0: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b  pTab->aCol; i>0;
cce0: 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   i--, pTabCol++)
ccf0: 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20  {.    wTable += 
cd00: 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  pTabCol->szEst;.
cd10: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
cd20: 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65  iPKey<0 ) wTable
cd30: 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61  ++;.  pTab->szTa
cd40: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
cd50: 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a  gEst(wTable*4);.
cd60: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
cd70: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69  e the average si
cd80: 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20  ze of a row for 
cd90: 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  an index..*/.sta
cda0: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
cdb0: 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65  eIndexWidth(Inde
cdc0: 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
cdd0: 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b  gned wIndex = 0;
cde0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
cdf0: 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d  t Column *aCol =
ce00: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
ce10: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
ce20: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
ce30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78   i++){.    i16 x
ce40: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
ce50: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
ce60: 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65  ( x<pIdx->pTable
ce70: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49  ->nCol );.    wI
ce80: 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20  ndex += x<0 ? 1 
ce90: 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  : aCol[pIdx->aiC
cea0: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b  olumn[i]].szEst;
ceb0: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49  .  }.  pIdx->szI
cec0: 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  dxRow = sqlite3L
ced0: 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b  ogEst(wIndex*4);
cee0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72  .}../* Return tr
cef0: 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73  ue if value x is
cf00: 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68   found any of th
cf10: 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  e first nCol ent
cf20: 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a  ries of aiCol[].
cf30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
cf40: 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31  sColumn(const i1
cf50: 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43  6 *aiCol, int nC
cf60: 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68  ol, int x){.  wh
cf70: 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20  ile( nCol-- > 0 
cf80: 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c  ) if( x==*(aiCol
cf90: 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ++) ) return 1;.
cfa0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
cfb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cfc0: 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e  e runs at the en
cfd0: 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43  d of parsing a C
cfe0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
cff0: 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61  ement that.** ha
d000: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
d010: 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a  D clause.  The j
d020: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
d030: 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74  ne is to convert
d040: 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61   both.** interna
d050: 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 74  l schema data st
d060: 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65  ructures and the
d070: 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20   generated VDBE 
d080: 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 65  code so that the
d090: 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72  y.** are appropr
d0a0: 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f  iate for a WITHO
d0b0: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69  UT ROWID table i
d0c0: 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69  nstead of a rowi
d0d0: 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e  d table..** Chan
d0e0: 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ges include:.**.
d0f0: 2a 2a 20 20 20 20 20 28 31 29 20 20 43 6f 6e 76  **     (1)  Conv
d100: 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74  ert the OP_Creat
d110: 65 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f  eTable into an O
d120: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20  P_CreateIndex.  
d130: 54 68 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20  There is.**     
d140: 20 20 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74       no rowid bt
d150: 72 65 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55  ree for a WITHOU
d160: 54 20 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61  T ROWID.  Instea
d170: 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  d, the canonical
d180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 64 61 74  .**          dat
d190: 61 20 73 74 6f 72 61 67 65 20 69 73 20 61 20 63  a storage is a c
d1a0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74  overing index bt
d1b0: 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20  ree..**     (2) 
d1c0: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
d1d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
d1e0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d1f0: 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  entry.**        
d200: 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52    for the PRIMAR
d210: 59 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69  Y KEY as the pri
d220: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69  mary key index i
d230: 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  s now.**        
d240: 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
d250: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d260: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66  r table entry of
d270: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
d280: 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 53  f..**     (3)  S
d290: 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75  et the Index.tnu
d2a0: 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  m of the PRIMARY
d2b0: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d2c0: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
d2d0: 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74       schema to t
d2e0: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d  he rootpage from
d2f0: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
d300: 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74  .**     (4)  Set
d310: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
d320: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d330: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
d340: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
d350: 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c       (5)  Add al
d360: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
d370: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
d380: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a  EY Index object.
d390: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  **          so t
d3a0: 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20  hat the PRIMARY 
d3b0: 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e  KEY is a coverin
d3c0: 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75  g index.  The su
d3d0: 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  rplus.**        
d3e0: 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61    columns are pa
d3f0: 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58  rt of KeyInfo.nX
d400: 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f  Field and are no
d410: 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20  t used for.**   
d420: 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f         sorting o
d430: 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71  r lookup or uniq
d440: 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a  ueness checks..*
d450: 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c 61  *     (6)  Repla
d460: 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61 69  ce the rowid tai
d470: 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74  l on all automat
d480: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
d490: 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20   UNIQUE.**      
d4a0: 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74 68      indices with
d4b0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d4c0: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
d4d0: 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74  tic void convert
d4e0: 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
d4f0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
d500: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
d510: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
d520: 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20    Index *pPk;.  
d530: 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69  int nPk;.  int i
d540: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
d550: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d560: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
d570: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f  rse->pVdbe;..  /
d580: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50  * Convert the OP
d590: 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63  _CreateTable opc
d5a0: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
d5b0: 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65 20 74  ormally create t
d5c0: 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67  he.  ** root-pag
d5d0: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
d5e0: 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74  into an OP_Creat
d5f0: 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e 20 20  eIndex opcode.  
d600: 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  The index.  ** c
d610: 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65 63 6f  reated will beco
d620: 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  me the PRIMARY K
d630: 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  EY index..  */. 
d640: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
d650: 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73  rCrTab ){.    as
d660: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73  sert( v );.    s
d670: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
d680: 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  v, pParse->addrC
d690: 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20 3d 20  rTab)->opcode = 
d6a0: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3b 0a  OP_CreateIndex;.
d6b0: 20 20 7d 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73    }..  /* Bypass
d6c0: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
d6d0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d6e0: 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73   btree and the s
d6f0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
d700: 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 20  * table entry.. 
d710: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
d720: 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 29 7b 0a  ->addrSkipPK ){.
d730: 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b      assert( v );
d740: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d750: 47 65 74 4f 70 28 76 2c 20 70 50 61 72 73 65 2d  GetOp(v, pParse-
d760: 3e 61 64 64 72 53 6b 69 70 50 4b 29 2d 3e 6f 70  >addrSkipPK)->op
d770: 63 6f 64 65 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a  code = OP_Goto;.
d780: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
d790: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d7a0: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
d7b0: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
d7c0: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
d7d0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
d7e0: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
d7f0: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
d800: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
d810: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
d820: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
d830: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
d840: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
d850: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
d860: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  d(pParse, 0, 0);
d870: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
d880: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
d890: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pList->a[0].zNam
d8a0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
d8b0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  Dup(pParse->db,.
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
d8f0: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
d900: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
d910: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
d920: 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  r = pParse->iPkS
d930: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73  ortOrder;.    as
d940: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
d950: 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  ewTable==pTab );
d960: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
d970: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
d980: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
d990: 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43  List, pTab->keyC
d9a0: 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  onf, 0, 0, 0, 0)
d9b0: 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 30  ;.    if( pPk==0
d9c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
d9d0: 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d 20 53 51  Pk->idxType = SQ
d9e0: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
d9f0: 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 70 54 61  MARYKEY;.    pTa
da00: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
da10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20   }else{.    pPk 
da20: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
da30: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
da40: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
da50: 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61  move all redunda
da60: 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  nt columns from 
da70: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
da80: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63    For example, c
da90: 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52  hange.    ** "PR
daa0: 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c  IMARY KEY(a,b,a,
dab0: 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f  b,c,b,c,d)" into
dac0: 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b   just "PRIMARY K
dad0: 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c  EY(a,b,c,d)".  L
dae0: 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  ater.    ** code
daf0: 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52 49   assumes the PRI
db00: 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e  MARY KEY contain
db10: 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f  s no repeated co
db20: 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  lumns..    */.  
db30: 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70    for(i=j=1; i<p
db40: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
db50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  ){.      if( has
db60: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
db70: 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61 69  lumn, j, pPk->ai
db80: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20  Column[i]) ){.  
db90: 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75        pPk->nColu
dba0: 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mn--;.      }els
dbb0: 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  e{.        pPk->
dbc0: 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20  aiColumn[j++] = 
dbd0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
dbe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dbf0: 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c      pPk->nKeyCol
dc00: 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d   = j;.  }.  pPk-
dc10: 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
dc20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d  .  assert( pPk!=
dc30: 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b  0 );.  nPk = pPk
dc40: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a  ->nKeyCol;..  /*
dc50: 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
dc60: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50   column of the P
dc70: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 4e 4f  RIMARY KEY is NO
dc80: 54 20 4e 55 4c 4c 2e 20 20 28 45 78 63 65 70 74  T NULL.  (Except
dc90: 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 65 6e  ,.  ** do not en
dca0: 66 6f 72 63 65 20 74 68 69 73 20 66 6f 72 20 69  force this for i
dcb0: 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 29  mposter tables.)
dcc0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
dcd0: 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
dce0: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
dcf0: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
dd00: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
dd10: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
dd20: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  ].notNull = 1;. 
dd30: 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 75 6e     }.    pPk->un
dd40: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
dd50: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f   }..  /* The roo
dd60: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52  t page of the PR
dd70: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65  IMARY KEY is the
dd80: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
dd90: 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20   */.  pPk->tnum 
dda0: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20  = pTab->tnum;.. 
ddb0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69   /* Update the i
ddc0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
ddd0: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55  ntation of all U
dde0: 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79  NIQUE indices by
ddf0: 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a   converting.  **
de00: 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
de10: 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65   column into one
de20: 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
de30: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
de40: 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  KEY..  */.  for(
de50: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
de60: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
de70: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
de80: 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49  int n;.    if( I
de90: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
dea0: 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75  (pIdx) ) continu
deb0: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  e;.    for(i=n=0
dec0: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
ded0: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
dee0: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
def0: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
df00: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
df10: 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  [i]) ) n++;.    
df20: 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  }.    if( n==0 )
df30: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
df40: 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72  index is a super
df50: 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61  set of the prima
df60: 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  ry key */.      
df70: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
df80: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
df90: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
dfa0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73     }.    if( res
dfb0: 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  izeIndexObject(d
dfc0: 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e  b, pIdx, pIdx->n
dfd0: 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75  KeyCol+n) ) retu
dfe0: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
dff0: 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j=pIdx->nKeyCol
e000: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
e010: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e020: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
e030: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
e040: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
e050: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
e060: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
e070: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
e080: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  n[i];.        pI
e090: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  dx->azColl[j] = 
e0a0: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  pPk->azColl[i];.
e0b0: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
e0c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
e0d0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
e0e0: 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  lumn>=pIdx->nKey
e0f0: 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73  Col+n );.    ass
e100: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
e110: 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20  mn>=j );.  }..  
e120: 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  /* Add all table
e130: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
e140: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
e150: 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b  x.  */.  if( nPk
e160: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
e170: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
e180: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b  exObject(db, pPk
e190: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20  , pTab->nCol) ) 
e1a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
e1b0: 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54  i=0, j=nPk; i<pT
e1c0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
e1d0: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e1e0: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
e1f0: 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20  mn, j, i) ){.   
e200: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
e210: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  Pk->nColumn );. 
e220: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
e230: 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20  lumn[j] = i;.   
e240: 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c       pPk->azColl
e250: 5b 6a 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  [j] = "BINARY";.
e260: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
e270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
e280: 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c  ssert( pPk->nCol
e290: 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73  umn==j );.    as
e2a0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
e2b0: 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==j );.  }else{.
e2c0: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
e2d0: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
e2e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
e2f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e300: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
e310: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
e320: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
e330: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
e340: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
e350: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
e360: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
e370: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
e380: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
e390: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
e3a0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
e3b0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
e3c0: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
e3d0: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
e3e0: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
e3f0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
e400: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
e410: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
e420: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
e430: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
e440: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
e450: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
e460: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
e470: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
e480: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
e490: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e4a0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
e4b0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
e4c0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
e4d0: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
e4e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
e4f0: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
e500: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
e510: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
e520: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
e530: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
e540: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e550: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
e560: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
e570: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
e580: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
e590: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
e5a0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
e5b0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
e5c0: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
e5d0: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
e5e0: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
e5f0: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
e600: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
e610: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
e620: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
e630: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
e640: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
e650: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
e660: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
e670: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
e680: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
e690: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e6a0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
e6b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
e6c0: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
e6d0: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
e6e0: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
e6f0: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
e700: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
e710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e720: 65 20 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74  e ')' before opt
e730: 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41  ions in the CREA
e740: 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38  TE TABLE */.  u8
e750: 20 74 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20   tabOpts,       
e760: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74        /* Extra t
e770: 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73  able options. Us
e780: 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65  ually 0. */.  Se
e790: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
e7a0: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20        /* Select 
e7b0: 66 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e  from a "CREATE .
e7c0: 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f  .. AS SELECT" */
e7d0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20  .){.  Table *p; 
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  /* The new table
e800: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
e810: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
e820: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
e830: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
e840: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
e850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
e860: 61 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74  abase in which t
e870: 68 65 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a  he table lives *
e880: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e8a0: 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65   An implied inde
e8b0: 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  x of the table *
e8c0: 2f 0a 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d  /..  if( (pEnd==
e8d0: 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29  0 && pSelect==0)
e8e0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e8f0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
e900: 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50  rn;.  }.  p = pP
e910: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
e920: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
e930: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
e940: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
e950: 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a  || !pSelect );..
e960: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
e970: 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20 69  init.busy is 1 i
e980: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
e990: 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f  eading the SQL o
e9a0: 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c  ff the.  ** "sql
e9b0: 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22  ite_master" or "
e9c0: 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
e9d0: 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  er" table on the
e9e0: 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64   disk..  ** So d
e9f0: 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  o not write to t
ea00: 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20  he disk again.  
ea10: 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74  Extract the root
ea20: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
ea30: 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
ea40: 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69  from the db->ini
ea50: 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e  t.newTnum field.
ea60: 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62    (The page numb
ea70: 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68  er.  ** should h
ea80: 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68 65  ave been put the
ea90: 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  re by the sqlite
eaa0: 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29  OpenCb routine.)
eab0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
eac0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
ead0: 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69   p->tnum = db->i
eae0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d  nit.newTnum;.  }
eaf0: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70  ..  /* Special p
eb00: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49  rocessing for WI
eb10: 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c  THOUT ROWID Tabl
eb20: 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f  es */.  if( tabO
eb30: 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  pts & TF_Without
eb40: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
eb50: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
eb60: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
eb70: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
eb80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
eb90: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55  e,.          "AU
eba0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20  TOINCREMENT not 
ebb0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f  allowed on WITHO
ebc0: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22  UT ROWID tables"
ebd0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
ebe0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
ebf0: 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
ec00: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d  _HasPrimaryKey)=
ec10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ec20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
ec30: 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59  se, "PRIMARY KEY
ec40: 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c   missing on tabl
ec50: 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  e %s", p->zName)
ec60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ec70: 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c     p->tabFlags |
ec80: 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  = TF_WithoutRowi
ec90: 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76 65 72 74  d;.      convert
eca0: 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
ecb0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ble(pParse, p);.
ecc0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62      }.  }..  iDb
ecd0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
ece0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
ecf0: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
ed00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
ed10: 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
ed20: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
ed30: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
ed40: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
ed50: 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
ed60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
ed70: 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
ed80: 6e 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e  nce(pParse, p, N
ed90: 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d  C_IsCheck, 0, p-
eda0: 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65  >pCheck);.  }.#e
edb0: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
edc0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45  (SQLITE_OMIT_CHE
edd0: 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74  CK) */..  /* Est
ede0: 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
edf0: 65 20 72 6f 77 20 73 69 7a 65 20 66 6f 72 20 74  e row size for t
ee00: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 66 6f 72  he table and for
ee10: 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64   all implied ind
ee20: 69 63 65 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61  ices */.  estima
ee30: 74 65 54 61 62 6c 65 57 69 64 74 68 28 70 29 3b  teTableWidth(p);
ee40: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70  .  for(pIdx=p->p
ee50: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
ee60: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
ee70: 20 20 20 20 65 73 74 69 6d 61 74 65 49 6e 64 65      estimateInde
ee80: 78 57 69 64 74 68 28 70 49 64 78 29 3b 0a 20 20  xWidth(pIdx);.  
ee90: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69  }..  /* If not i
eea0: 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65  nitializing, the
eeb0: 6e 20 63 72 65 61 74 65 20 61 20 72 65 63 6f 72  n create a recor
eec0: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  d for the new ta
eed0: 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ble.  ** in the 
eee0: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
eef0: 62 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ble of the datab
ef00: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
ef10: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
ef20: 4f 52 41 52 59 20 74 61 62 6c 65 2c 20 77 72 69  ORARY table, wri
ef30: 74 65 20 74 68 65 20 65 6e 74 72 79 20 69 6e 74  te the entry int
ef40: 6f 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 0a  o the auxiliary.
ef50: 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61    ** file instea
ef60: 64 20 6f 66 20 69 6e 74 6f 20 74 68 65 20 6d 61  d of into the ma
ef70: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
ef80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
ef90: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
efa0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64     int n;.    Vd
efb0: 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
efc0: 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a 20 22 76  *zType;    /* "v
efd0: 69 65 77 22 20 6f 72 20 22 74 61 62 6c 65 22 20  iew" or "table" 
efe0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79  */.    char *zTy
eff0: 70 65 32 3b 20 20 20 2f 2a 20 22 56 49 45 57 22  pe2;   /* "VIEW"
f000: 20 6f 72 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20   or "TABLE" */. 
f010: 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20     char *zStmt; 
f020: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
f030: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f  e CREATE TABLE o
f040: 72 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  r CREATE VIEW st
f050: 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20  atement */..    
f060: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f070: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
f080: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
f090: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73  ) return;..    s
f0a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f0b0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29  (v, OP_Close, 0)
f0c0: 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a  ;..    /* .    *
f0d0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79  * Initialize zTy
f0e0: 70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 76  pe for the new v
f0f0: 69 65 77 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20  iew or table..  
f100: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
f110: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
f120: 20 20 20 20 2f 2a 20 41 20 72 65 67 75 6c 61 72      /* A regular
f130: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
f140: 7a 54 79 70 65 20 3d 20 22 74 61 62 6c 65 22 3b  zType = "table";
f150: 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
f160: 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66  "TABLE";.#ifndef
f170: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
f180: 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  W.    }else{.   
f190: 20 20 20 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a     /* A view */.
f1a0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 76        zType = "v
f1b0: 69 65 77 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  iew";.      zTyp
f1c0: 65 32 20 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e  e2 = "VIEW";.#en
f1d0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
f1e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 43  * If this is a C
f1f0: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 20 41  REATE TABLE xx A
f200: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78  S SELECT ..., ex
f210: 65 63 75 74 65 20 74 68 65 20 53 45 4c 45 43 54  ecute the SELECT
f220: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
f230: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  t to populate th
f240: 65 20 6e 65 77 20 74 61 62 6c 65 2e 20 54 68 65  e new table. The
f250: 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
f260: 72 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  r for the.    **
f270: 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 69 6e   new table is in
f280: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
f290: 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a  ->regRoot..    *
f2a0: 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68  *.    ** Once th
f2b0: 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65  e SELECT has bee
f2c0: 6e 20 63 6f 64 65 64 20 62 79 20 73 71 6c 69 74  n coded by sqlit
f2d0: 65 33 53 65 6c 65 63 74 28 29 2c 20 69 74 20 69  e3Select(), it i
f2e0: 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75  s in a.    ** su
f2f0: 69 74 61 62 6c 65 20 73 74 61 74 65 20 74 6f 20  itable state to 
f300: 71 75 65 72 79 20 66 6f 72 20 74 68 65 20 63 6f  query for the co
f310: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74  lumn names and t
f320: 79 70 65 73 20 74 6f 20 62 65 20 75 73 65 64 0a  ypes to be used.
f330: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 6e 65      ** by the ne
f340: 77 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  w table..    **.
f350: 20 20 20 20 2a 2a 20 41 20 73 68 61 72 65 64 2d      ** A shared-
f360: 63 61 63 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  cache write-lock
f370: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
f380: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
f390: 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20 20 20 20   new table,.    
f3a0: 2a 2a 20 61 73 20 61 20 73 63 68 65 6d 61 2d 6c  ** as a schema-l
f3b0: 6f 63 6b 20 6d 75 73 74 20 68 61 76 65 20 61 6c  ock must have al
f3c0: 72 65 61 64 79 20 62 65 65 6e 20 6f 62 74 61 69  ready been obtai
f3d0: 6e 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 74  ned to create it
f3e0: 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61  . Since.    ** a
f3f0: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63   schema-lock exc
f400: 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68 65 72 20  ludes all other 
f410: 64 61 74 61 62 61 73 65 20 75 73 65 72 73 2c 20  database users, 
f420: 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  the write-lock w
f430: 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 72  ould.    ** be r
f440: 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f  edundant..    */
f450: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
f460: 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
f470: 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20  Dest dest;.     
f480: 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
f490: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ..      assert(p
f4a0: 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b  Parse->nTab==1);
f4b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f4c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
f4d0: 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61  penWrite, 1, pPa
f4e0: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44  rse->regRoot, iD
f4f0: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
f500: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
f510: 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29   OPFLAG_P2ISREG)
f520: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
f530: 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
f540: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
f550: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
f560: 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20  _Table, 1);.    
f570: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
f580: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
f590: 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73   &dest);.      s
f5a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f5b0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29  (v, OP_Close, 1)
f5c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
f5d0: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20  se->nErr==0 ){. 
f5e0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d         pSelTab =
f5f0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
f600: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
f610: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
f620: 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
f630: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
f640: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
f650: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
f660: 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65     p->nCol = pSe
f670: 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  lTab->nCol;.    
f680: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53      p->aCol = pS
f690: 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
f6a0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
f6b0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
f6c0: 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
f6d0: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
f6e0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
f6f0: 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
f700: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
f710: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
f720: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
f730: 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
f740: 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
f750: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
f760: 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
f770: 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
f780: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f790: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
f7a0: 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
f7b0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
f7c0: 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
f7d0: 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
f7e0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
f7f0: 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
f800: 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
f810: 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
f820: 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
f830: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
f840: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
f850: 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
f860: 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
f870: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
f880: 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
f890: 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
f8a0: 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
f8b0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
f8c0: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
f8d0: 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
f8e0: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
f8f0: 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
f900: 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
f910: 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
f920: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
f930: 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
f940: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
f950: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
f960: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
f970: 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
f980: 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
f990: 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
f9a0: 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
f9b0: 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
f9c0: 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
f9d0: 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
f9e0: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
f9f0: 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
fa00: 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
fa10: 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
fa20: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
fa30: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
fa40: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
fa50: 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
fa60: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
fa70: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
fa80: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
fa90: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
faa0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
fab0: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
fac0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fad0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
fae0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
faf0: 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
fb00: 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
fb10: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
fb20: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
fb30: 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
fb40: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
fb50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fb60: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54   p->tabFlags & T
fb70: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
fb80: 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
fb90: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
fba0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fbb0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
fbc0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
fbd0: 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
fbe0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
fbf0: 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
fc00: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
fc10: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
fc20: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
fc30: 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
fc40: 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
fc50: 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
fc60: 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
fc70: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
fc80: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
fc90: 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
fca0: 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
fcb0: 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
fcc0: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
fcd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fce0: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
fcf0: 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
fd00: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
fd10: 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d  f(db, "tbl_name=
fd20: 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27  '%q' AND type!='
fd30: 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e  trigger'", p->zN
fd40: 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ame));.  }...  /
fd50: 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
fd60: 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
fd70: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
fd80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
fd90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
fda0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
fdb0: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
fdc0: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
fdd0: 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
fde0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
fdf0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
fe00: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
fe10: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
fe20: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
fe30: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
fe40: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a  , p->zName, p);.
fe50: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
fe60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
fe70: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
fe80: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
fe90: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
fea0: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
feb0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
fec0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ed = 1;.      re
fed0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
fee0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
fef0: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66  e = 0;.    db->f
ff00: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
ff10: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
ff20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ff30: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
ff40: 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
ff50: 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
ff60: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
ff70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
ff80: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
ff90: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
ffa0: 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
ffb0: 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
ffc0: 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
ffd0: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
ffe0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
fff0: 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
10000 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
10010 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74  e = (int)((const
10020 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a   char *)pCons->z
10030 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20   - zName);.     
10040 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
10050 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
10060 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
10070 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
10080 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
10090 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
100a0 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
100b0 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
100c0 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
100d0 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
100e0 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
100f0 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
10100 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
10110 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
10120 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
10130 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
10140 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
10150 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
10160 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
10170 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
10180 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
10190 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
101a0 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
101b0 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
101c0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
101d0 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
101e0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
101f0 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
10200 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
10210 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
10220 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
10230 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
10240 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
10250 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
10260 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
10270 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
10280 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
10290 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
102a0 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
102b0 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
102c0 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
102d0 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
102e0 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
102f0 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
10300 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
10310 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
10320 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
10330 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
10340 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10350 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
10360 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
10370 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
10380 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
10390 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
103a0 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
103b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
103c0 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
103d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
103e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72   }.  sqlite3Star
103f0 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
10400 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
10410 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45  sTemp, 1, 0, noE
10420 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  rr);.  p = pPars
10430 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
10440 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
10450 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
10460 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
10470 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
10480 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
10490 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  }.  sqlite3TwoPa
104a0 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
104b0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
104c0 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20  pName);.  iDb = 
104d0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
104e0 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
104f0 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ema);.  sqlite3F
10500 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
10510 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77  arse, iDb, "view
10520 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ", pName);.  if(
10530 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
10540 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
10550 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
10560 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
10570 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
10580 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
10590 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
105a0 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
105b0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
105c0 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
105d0 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
105e0 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
105f0 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
10600 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
10610 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
10620 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
10630 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
10640 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
10650 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
10660 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
10670 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
10680 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
10690 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
106a0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
106b0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
106c0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
106d0 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
106e0 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  DUCE);.  sqlite3
106f0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
10700 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28   pSelect);.  if(
10710 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
10720 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
10730 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e  .  }.  if( !db->
10740 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10750 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
10760 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
10770 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
10780 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
10790 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
107a0 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
107b0 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
107c0 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
107d0 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
107e0 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
107f0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 73  ;.  if( ALWAYS(s
10800 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20  End.z[0]!=0) && 
10810 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
10820 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
10830 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
10840 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
10850 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
10860 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d  Begin->z);.  z =
10870 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
10880 69 6c 65 28 20 41 4c 57 41 59 53 28 6e 3e 30 29  ile( ALWAYS(n>0)
10890 20 26 26 20 73 71 6c 69 74 65 33 49 73 73 70 61   && sqlite3Isspa
108a0 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d  ce(z[n-1]) ){ n-
108b0 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
108c0 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
108d0 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
108e0 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
108f0 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
10900 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
10910 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
10920 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
10930 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73  le(pParse, 0, &s
10940 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  End, 0, 0);.  re
10950 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
10960 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
10970 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
10980 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10990 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
109a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
109b0 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
109c0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
109d0 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
109e0 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
109f0 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
10a00 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
10a10 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
10a20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
10a30 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
10a40 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
10a50 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
10a60 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
10a70 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
10a80 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
10a90 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
10aa0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
10ab0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
10ac0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
10ad0 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
10ae0 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
10af0 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
10b00 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
10b10 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
10b20 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
10b30 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
10b40 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
10b50 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
10b60 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
10b70 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
10b80 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
10b90 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
10ba0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
10bb0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
10bc0 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
10bd0 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
10be0 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
10bf0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
10c00 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
10c10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
10c20 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
10c30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75  */.  sqlite3_xau
10c40 74 68 20 78 41 75 74 68 3b 20 20 20 20 20 20 20  th xAuth;       
10c50 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68 20 70  /* Saved xAuth p
10c60 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
10c70 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
10c80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10c90 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10ca0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
10cb0 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
10cc0 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
10cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10ce0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
10cf0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
10d00 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
10d10 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
10d20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10d30 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
10d40 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
10d50 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
10d60 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
10d70 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
10d80 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
10d90 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
10da0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
10db0 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
10dc0 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
10dd0 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
10de0 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
10df0 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
10e00 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
10e10 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
10e20 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
10e30 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
10e40 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
10e50 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
10e60 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
10e70 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
10e80 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
10e90 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
10ea0 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
10eb0 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
10ec0 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
10ed0 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
10ee0 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
10ef0 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
10f00 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
10f10 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
10f20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
10f30 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
10f40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
10f50 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
10f60 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
10f70 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
10f80 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
10f90 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
10fa0 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
10fb0 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
10fc0 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
10fd0 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
10fe0 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
10ff0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
11000 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
11010 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
11020 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
11030 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11040 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
11050 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
11060 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
11070 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
11080 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
11090 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
110a0 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
110b0 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
110c0 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
110d0 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
110e0 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
110f0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
11100 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
11110 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
11120 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
11130 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
11140 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
11150 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
11160 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
11170 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
11180 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
11190 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
111a0 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
111b0 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
111c0 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
111d0 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
111e0 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
111f0 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
11200 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
11210 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
11220 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
11230 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
11240 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
11250 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
11260 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
11270 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
11280 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
11290 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
112a0 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69  u8 enableLookasi
112b0 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  de = db->lookasi
112c0 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20  de.bEnabled;.   
112d0 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
112e0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
112f0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
11300 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
11310 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
11320 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
11330 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
11340 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  .bEnabled = 0;.#
11350 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11360 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
11370 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
11380 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
11390 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
113a0 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
113b0 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
113c0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
113d0 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
113e0 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
113f0 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
11400 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
11410 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
11420 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  l);.#endif.    d
11430 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
11440 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f  abled = enableLo
11450 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61  okaside;.    pPa
11460 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
11470 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29     if( pSelTab )
11480 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11490 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
114a0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
114b0 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
114c0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
114d0 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
114e0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
114f0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
11500 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
11510 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
11520 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
11530 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
11540 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b);.      assert
11550 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
11560 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
11570 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
11580 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
11590 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ->pSchema->schem
115a0 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  aFlags |= DB_Unr
115b0 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d  esetViews;.    }
115c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
115d0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
115e0 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
115f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
11600 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
11610 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  el);.  } else {.
11620 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
11630 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11640 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
11650 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
11660 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
11670 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11680 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
11690 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
116a0 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
116b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
116c0 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
116d0 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
116e0 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
116f0 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
11700 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
11710 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
11720 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
11730 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
11740 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
11750 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11760 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
11770 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20  db, idx, 0) );. 
11780 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
11790 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
117a0 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
117b0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
117c0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
117d0 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
117e0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
117f0 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
11800 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
11810 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
11820 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
11830 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
11840 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
11850 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  iteDeleteColumnN
11860 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a  ames(db, pTab);.
11870 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
11880 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
11890 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
118a0 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
118b0 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
118c0 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
118d0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
118e0 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
118f0 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
11900 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11910 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
11920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11930 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
11940 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
11950 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
11960 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
11970 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
11980 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
11990 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
119a0 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
119b0 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
119c0 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
119d0 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
119e0 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
119f0 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
11a00 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
11a10 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
11a20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
11a30 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
11a40 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
11a50 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
11a60 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
11a70 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
11a80 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
11a90 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
11aa0 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
11ab0 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
11ac0 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
11ad0 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
11ae0 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
11af0 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
11b00 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
11b10 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
11b20 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
11b30 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
11b40 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
11b50 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
11b60 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
11b70 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
11b80 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
11b90 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
11ba0 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
11bb0 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
11bc0 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
11bd0 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
11be0 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
11bf0 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
11c00 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
11c10 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
11c20 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
11c30 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
11c40 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
11c50 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
11c60 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
11c70 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
11c80 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
11c90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11ca0 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
11cb0 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
11cc0 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  oved(sqlite3 *db
11cd0 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
11ce0 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
11cf0 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
11d00 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
11d10 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
11d20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
11d30 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
11d40 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
11d50 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
11d60 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  Db];.  pHash = &
11d70 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
11d80 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
11d90 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
11da0 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
11db0 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
11dc0 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
11dd0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
11de0 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
11df0 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
11e00 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
11e10 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
11e20 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
11e30 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
11e40 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
11e50 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
11e60 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
11e70 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
11e80 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
11e90 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
11ea0 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
11eb0 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
11ec0 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
11ed0 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
11ee0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
11ef0 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
11f00 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
11f10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
11f20 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
11f30 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
11f40 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
11f50 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
11f60 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
11f70 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
11f80 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
11f90 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
11fa0 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
11fb0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
11fc0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
11fd0 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
11fe0 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
11ff0 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
12000 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
12010 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
12020 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
12030 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
12040 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
12050 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
12060 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
12070 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
12080 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
12090 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
120a0 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
120b0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
120c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
120d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74  ddOp3(v, OP_Dest
120e0 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  roy, iTable, r1,
120f0 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
12100 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
12110 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12120 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12130 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
12140 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e   stores an in in
12150 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69  teger r1. If thi
12160 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
12170 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
12180 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
12190 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
121a0 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
121b0 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
121c0 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
121d0 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
121e0 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
121f0 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
12200 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
12210 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
12220 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20  NNN" in the SQL 
12230 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e  is a special con
12240 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73  stant that means
12250 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a   whatever value.
12260 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73    ** is in regis
12270 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72  ter NNN.  See gr
12280 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f  ammar rules asso
12290 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
122a0 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a  TK_REGISTER.  **
122b0 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74   token for addit
122c0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
122d0 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  n..  */.  sqlite
122e0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
122f0 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41  rse, .     "UPDA
12300 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f  TE %Q.%s SET roo
12310 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23  tpage=%d WHERE #
12320 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d  %d AND rootpage=
12330 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73  #%d",.     pPars
12340 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
12350 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
12360 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65  BLE(iDb), iTable
12370 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69  , r1, r1);.#endi
12380 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  f.  sqlite3Relea
12390 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
123a0 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
123b0 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20  Write VDBE code 
123c0 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70  to erase table p
123d0 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f  Tab and all asso
123e0 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f  ciated indices o
123f0 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20  n disk..** Code 
12400 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71  to update the sq
12410 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
12420 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  es and internal 
12430 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f  schema definitio
12440 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20  ns.** in case a 
12450 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67  root-page belong
12460 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74  ing to another t
12470 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79  able is moved by
12480 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
12490 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65  .** is also adde
124a0 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  d (this can happ
124b0 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
124c0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
124d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
124e0 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61   destroyTable(Pa
124f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
12500 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65  le *pTab){.#ifde
12510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12520 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78  TOVACUUM.  Index
12530 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44   *pIdx;.  int iD
12540 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12550 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
12560 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
12570 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f  ma);.  destroyRo
12580 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
12590 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Tab->tnum, iDb);
125a0 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
125b0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
125c0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
125d0 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  ){.    destroyRo
125e0 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
125f0 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  Idx->tnum, iDb);
12600 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  .  }.#else.  /* 
12610 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
12620 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75  may be auto-vacu
12630 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53  um capable (if S
12640 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12650 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f  ACUUM.  ** is no
12660 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e  t defined), then
12670 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
12680 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74   to call OP_Dest
12690 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  roy on the.  ** 
126a0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
126b0 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72  root-pages in or
126c0 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69  der, starting wi
126d0 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c  th the numerical
126e0 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  ly .  ** largest
126f0 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
12700 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  r. This guarante
12710 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20  es that none of 
12720 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20  the root-pages. 
12730 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f   ** to be destro
12740 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64  yed is relocated
12750 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f   by an earlier O
12760 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20  P_Destroy. i.e. 
12770 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c  if the.  ** foll
12780 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64  owing were coded
12790 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44  :.  **.  ** OP_D
127a0 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20  estroy 4 0.  ** 
127b0 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74  ....  ** OP_Dest
127c0 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a  roy 5 0.  **.  *
127d0 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20  * and root page 
127e0 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65  5 happened to be
127f0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
12800 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  t-page number in
12810 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
12820 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61  se, then root pa
12830 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f  ge 5 would be mo
12840 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79  ved to page 4 by
12850 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44   the .  ** "OP_D
12860 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f  estroy 4 0" opco
12870 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65  de. The subseque
12880 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35  nt "OP_Destroy 5
12890 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20   0" would hit.  
128a0 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70  ** a free-list p
128b0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  age..  */.  int 
128c0 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75  iTab = pTab->tnu
128d0 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f  m;.  int iDestro
128e0 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  yed = 0;..  whil
128f0 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65  e( 1 ){.    Inde
12900 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74  x *pIdx;.    int
12910 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a   iLargest = 0;..
12920 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79      if( iDestroy
12930 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44  ed==0 || iTab<iD
12940 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20  estroyed ){.    
12950 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61    iLargest = iTa
12960 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  b;.    }.    for
12970 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
12980 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
12990 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
129a0 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49     int iIdx = pI
129b0 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20  dx->tnum;.      
129c0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53  assert( pIdx->pS
129d0 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
129e0 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66  hema );.      if
129f0 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30  ( (iDestroyed==0
12a00 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72   || (iIdx<iDestr
12a10 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69  oyed)) && iIdx>i
12a20 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20  Largest ){.     
12a30 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49     iLargest = iI
12a40 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dx;.      }.    
12a50 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65  }.    if( iLarge
12a60 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
12a70 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  eturn;.    }else
12a80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
12a90 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
12aa0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
12ab0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
12ac0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
12ad0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70   iDb>=0 && iDb<p
12ae0 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29  Parse->db->nDb )
12af0 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52  ;.      destroyR
12b00 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
12b10 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a  iLargest, iDb);.
12b20 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64        iDestroyed
12b30 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20   = iLargest;.   
12b40 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a   }.  }.#endif.}.
12b50 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e  ./*.** Remove en
12b60 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73  tries from the s
12b70 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c  qlite_statN tabl
12b80 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c  es (for N in (1,
12b90 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61  2,3)).** after a
12ba0 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44   DROP INDEX or D
12bb0 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e  ROP TABLE comman
12bc0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
12bd0 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74  d sqlite3ClearSt
12be0 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73  atTables(.  Pars
12bf0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
12c00 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
12c10 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
12c20 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20  nt iDb,         
12c30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
12c40 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
12c50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
12c60 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78  ype,     /* "idx
12c70 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20  " or "tbl" */.  
12c80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
12c90 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e      /* Name o
12ca0 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  f index or table
12cb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
12cc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
12cd0 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e  bName = pParse->
12ce0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
12cf0 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  me;.  for(i=1; i
12d00 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  <=4; i++){.    c
12d10 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20  har zTab[24];.  
12d20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
12d30 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c  tf(sizeof(zTab),
12d40 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61  zTab,"sqlite_sta
12d50 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28  t%d",i);.    if(
12d60 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
12d70 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54  e(pParse->db, zT
12d80 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a  ab, zDbName) ){.
12d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
12da0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
12db0 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
12dc0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
12dd0 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20  E %s=%Q",.      
12de0 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c    zDbName, zTab,
12df0 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20   zType, zName.  
12e00 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
12e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
12e20 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20  te code to drop 
12e30 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
12e40 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
12e50 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
12e60 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
12e70 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
12e80 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a  sView){.  Vdbe *
12e90 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
12ea0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
12eb0 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67   Trigger *pTrigg
12ec0 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20  er;.  Db *pDb = 
12ed0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
12ee0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
12ef0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
12f00 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
12f10 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
12f20 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
12f30 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
12f40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12f50 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
12f60 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
12f70 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
12f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
12f90 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20  , OP_VBegin);.  
12fa0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
12fb0 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73  rop all triggers
12fc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12fd0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
12fe0 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20   dropped. Code. 
12ff0 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64   ** is generated
13000 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69   to remove entri
13010 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d  es from sqlite_m
13020 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a  aster and/or.  *
13030 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  * sqlite_temp_ma
13040 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64  ster if required
13050 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65  ..  */.  pTrigge
13060 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  r = sqlite3Trigg
13070 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  erList(pParse, p
13080 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  Tab);.  while( p
13090 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61  Trigger ){.    a
130a0 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d  ssert( pTrigger-
130b0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
130c0 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20  pSchema || .    
130d0 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53      pTrigger->pS
130e0 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
130f0 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
13100 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67   sqlite3DropTrig
13110 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70  gerPtr(pParse, p
13120 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54  Trigger);.    pT
13130 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65  rigger = pTrigge
13140 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23  r->pNext;.  }..#
13150 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13160 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
13170 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79  .  /* Remove any
13180 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20   entries of the 
13190 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
131a0 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
131b0 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74   with.  ** the t
131c0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
131d0 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  ed. This is done
131e0 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c   before the tabl
131f0 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a  e is dropped.  *
13200 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c  * at the btree l
13210 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68  evel, in case th
13220 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  e sqlite_sequenc
13230 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f  e table needs to
13240 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20  .  ** move as a 
13250 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72  result of the dr
13260 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69  op (can happen i
13270 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
13280 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  de)..  */.  if( 
13290 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
132a0 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
132b0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
132c0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
132d0 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54  se,.      "DELET
132e0 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65  E FROM %Q.sqlite
132f0 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20  _sequence WHERE 
13300 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
13310 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  pDb->zName, pTab
13320 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
13330 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13340 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
13350 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
13360 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
13370 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
13380 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
13390 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
133a0 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
133b0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
133c0 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76   deletes.  ** ev
133d0 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
133e0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
133f0 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
13400 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
13410 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54  .  ** dropped. T
13420 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
13430 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62  led separately b
13440 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
13450 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65   can be.  ** cre
13460 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
13470 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
13480 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
13490 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a   in another.  **
134a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
134b0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
134c0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
134d0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
134e0 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
134f0 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
13500 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
13510 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c       pDb->zName,
13520 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
13530 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  b), pTab->zName)
13540 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  ;.  if( !isView 
13550 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
13560 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72  ab) ){.    destr
13570 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  oyTable(pParse, 
13580 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pTab);.  }..  /*
13590 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   Remove the tabl
135a0 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c  e entry from SQL
135b0 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73  ite's internal s
135c0 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79  chema and modify
135d0 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61  .  ** the schema
135e0 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20   cookie..  */.  
135f0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
13600 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
13610 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13620 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62  OP_VDestroy, iDb
13630 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
13640 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  ame, 0);.  }.  s
13650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13660 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65  (v, OP_DropTable
13670 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
13680 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
13690 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
136a0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
136b0 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65  ;.  sqliteViewRe
136c0 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b  setAll(db, iDb);
136d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
136e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
136f0 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20   to do the work 
13700 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20  of a DROP TABLE 
13710 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e  statement..** pN
13720 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
13730 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
13740 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76  be dropped..*/.v
13750 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54  oid sqlite3DropT
13760 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
13770 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61  se, SrcList *pNa
13780 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20  me, int isView, 
13790 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61  int noErr){.  Ta
137a0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62  ble *pTab;.  Vdb
137b0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
137c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
137d0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
137e0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
137f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
13800 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13810 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
13820 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
13830 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61  );.  assert( pNa
13840 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
13850 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
13860 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a  >suppressErr++;.
13870 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
13880 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
13890 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20  pParse, isView, 
138a0 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20  &pName->a[0]);. 
138b0 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
138c0 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a  >suppressErr--;.
138d0 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
138e0 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20  {.    if( noErr 
138f0 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
13900 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70  ifyNamedSchema(p
13910 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
13920 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
13930 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13940 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
13950 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
13960 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
13970 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13980 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
13990 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
139a0 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69  ..  /* If pTab i
139b0 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  s a virtual tabl
139c0 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43  e, call ViewGetC
139d0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20  olumnNames() to 
139e0 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69  ensure.  ** it i
139f0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  s initialized.. 
13a00 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
13a10 75 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c  ual(pTab) && sql
13a20 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
13a30 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
13a40 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Tab) ){.    goto
13a50 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13a60 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
13a70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
13a80 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
13a90 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f  int code;.    co
13aa0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
13ab0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
13ac0 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
13ad0 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
13ae0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
13af0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
13b00 72 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rg2 = 0;.    if(
13b10 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13b20 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
13b30 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
13b40 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67  , zDb)){.      g
13b50 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
13b60 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ble;.    }.    i
13b70 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
13b80 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
13b90 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
13ba0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
13bb0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50  SQLITE_DROP_TEMP
13bc0 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c  _VIEW;.      }el
13bd0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
13be0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56   = SQLITE_DROP_V
13bf0 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  IEW;.      }.#if
13c00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13c10 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
13c20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69    }else if( IsVi
13c30 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13c40 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
13c50 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a  TE_DROP_VTABLE;.
13c60 20 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71        zArg2 = sq
13c70 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
13c80 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e  b, pTab)->pMod->
13c90 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  zName;.#endif.  
13ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
13cb0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
13cc0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
13cd0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
13ce0 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
13cf0 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
13d00 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
13d10 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
13d20 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
13d30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13d40 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13d50 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
13d60 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29  ame, zArg2, zDb)
13d70 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13d80 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13d90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
13da0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
13db0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
13dc0 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
13dd0 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
13de0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13df0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
13e00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
13e10 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
13e20 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
13e30 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
13e40 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
13e50 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
13e60 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  me, "sqlite_stat
13e70 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20  ", 11)!=0 ){.   
13e80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13e90 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
13ea0 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72  %s may not be dr
13eb0 6f 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  opped", pTab->zN
13ec0 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
13ed0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13ee0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
13ef0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
13f00 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54  /* Ensure DROP T
13f10 41 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64  ABLE is not used
13f20 20 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20   on a view, and 
13f30 44 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74  DROP VIEW is not
13f40 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20   used.  ** on a 
13f50 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
13f60 28 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62  ( isView && pTab
13f70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
13f80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13f90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65  Msg(pParse, "use
13fa0 20 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64   DROP TABLE to d
13fb0 65 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c  elete table %s",
13fc0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13fd0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13fe0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
13ff0 66 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54  f( !isView && pT
14000 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
14010 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14020 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
14030 44 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c  DROP VIEW to del
14040 65 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54  ete view %s", pT
14050 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14060 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14070 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
14080 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14090 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
140a0 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
140b0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20  e master table. 
140c0 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a   ** on disk..  *
140d0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
140e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
140f0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
14100 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
14110 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
14120 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
14130 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54  qlite3ClearStatT
14140 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44  ables(pParse, iD
14150 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e  b, "tbl", pTab->
14160 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
14170 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70  te3FkDropTable(p
14180 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54  Parse, pName, pT
14190 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
141a0 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50  CodeDropTable(pP
141b0 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c  arse, pTab, iDb,
141c0 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65   isView);.  }..e
141d0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
141e0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
141f0 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
14200 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
14210 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
14220 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
14230 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
14240 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
14250 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
14260 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
14270 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
14280 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
14290 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
142a0 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
142b0 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
142c0 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
142d0 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
142e0 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
142f0 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
14300 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
14310 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
14320 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
14330 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22   to (a.k.a the "
14340 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20  parent" table). 
14350 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
14360 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69  t.** of tables i
14370 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f  n the parent pTo
14380 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63   table.  flags c
14390 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
143a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
143b0 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
143c0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
143d0 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
143e0 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
143f0 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
14400 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
14410 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
14420 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
14430 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
14440 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
14450 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
14460 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
14470 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
14480 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a  wTable field..**
14490 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
144a0 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
144b0 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
144c0 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
144d0 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
144e0 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
144f0 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
14500 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
14510 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
14520 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
14530 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
14540 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
14550 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14560 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
14570 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
14580 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
14590 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
145a0 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
145b0 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
145c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
145d0 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
145e0 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
145f0 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
14600 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
14610 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
14620 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
14630 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
14640 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
14650 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
14660 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14670 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
14680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
14690 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
146a0 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46   *pFKey = 0;.  F
146b0 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20  Key *pNextTo;.  
146c0 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
146d0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
146e0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
146f0 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
14700 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
14710 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
14720 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
14730 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
14740 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
14750 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
14760 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
14770 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
14780 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
14790 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
147a0 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
147b0 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
147c0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
147d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
147e0 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
147f0 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
14800 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
14810 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
14820 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
14830 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
14840 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
14850 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
14860 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
14870 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
14880 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
14890 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
148a0 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
148b0 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
148c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
148d0 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
148e0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
148f0 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
14900 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
14910 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
14920 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
14930 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
14940 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
14950 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
14960 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
14970 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
14980 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
14990 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
149a0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
149b0 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
149c0 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
149d0 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
149e0 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
149f0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
14a00 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
14a10 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
14a20 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
14a30 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
14a40 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
14a50 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
14a60 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
14a70 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
14a80 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
14a90 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
14aa0 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
14ab0 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
14ac0 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
14ad0 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
14ae0 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
14af0 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79  To = z;.  memcpy
14b00 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
14b10 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
14b20 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
14b30 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
14b40 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
14b50 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
14b60 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
14b70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
14b80 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
14b90 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
14ba0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
14bb0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
14bc0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
14bd0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
14be0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
14bf0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14c00 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
14c10 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
14c20 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
14c30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14c40 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
14c50 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
14c60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14c70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14c80 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
14c90 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
14ca0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14cb0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
14cc0 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
14cd0 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
14ce0 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
14cf0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
14d00 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
14d10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
14d20 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
14d30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
14d40 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
14d50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
14d60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
14d70 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
14d80 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
14d90 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
14da0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
14db0 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20  zCol = z;.      
14dc0 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c  memcpy(z, pToCol
14dd0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29  ->a[i].zName, n)
14de0 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30  ;.      z[n] = 0
14df0 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31  ;.      z += n+1
14e00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
14e10 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
14e20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41  = 0;.  pFKey->aA
14e30 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28  ction[0] = (u8)(
14e40 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20  flags & 0xff);  
14e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20            /* ON 
14e60 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f  DELETE action */
14e70 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
14e80 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61  n[1] = (u8)((fla
14e90 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66  gs >> 8 ) & 0xff
14ea0 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41  );    /* ON UPDA
14eb0 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  TE action */..  
14ec0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
14ed0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
14ee0 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61  b, 0, p->pSchema
14ef0 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d  ) );.  pNextTo =
14f00 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33   (FKey *)sqlite3
14f10 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
14f20 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68  Schema->fkeyHash
14f30 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  , .      pFKey->
14f40 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b  zTo, (void *)pFK
14f50 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e  ey.  );.  if( pN
14f60 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a  extTo==pFKey ){.
14f70 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
14f80 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 67 6f  iled = 1;.    go
14f90 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
14fa0 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
14fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
14fc0 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
14fd0 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
14fe0 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
14ff0 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
15000 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
15010 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
15020 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
15030 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
15040 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
15050 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
15060 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
15070 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
15080 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15090 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
150a0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
150b0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
150c0 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
150d0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
150e0 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
150f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
15100 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
15110 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
15120 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15130 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
15140 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
15150 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
15160 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
15170 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
15180 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
15190 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
151a0 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
151b0 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
151c0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
151d0 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
151e0 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
151f0 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
15200 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
15210 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
15220 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
15230 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
15240 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
15250 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
15260 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
15270 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
15280 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
15290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
152a0 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
152b0 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
152c0 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
152d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
152e0 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
152f0 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
15300 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
15310 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
15320 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
15330 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
15340 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
15350 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
15360 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
15370 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
15380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15390 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
153a0 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
153b0 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
153c0 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
153d0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
153e0 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
153f0 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
15400 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
15410 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
15420 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
15430 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
15440 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
15450 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
15460 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
15470 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
15480 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
15490 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
154a0 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
154b0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
154c0 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
154d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
154e0 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
154f0 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
15500 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
15510 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
15520 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
15530 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
15540 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
15550 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
15560 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
15570 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
15580 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
15590 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
155a0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
155b0 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
155c0 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
155d0 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
155e0 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
155f0 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
15600 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
15610 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
15620 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
15630 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
15640 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
15650 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
15660 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
15670 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
15680 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
15690 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
156a0 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
156b0 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20  .  int iSorter; 
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
156e0 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72  ed by OpenSorter
156f0 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a   (if in use) */.
15700 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
15730 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
15740 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20  int addr2;      
15750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15760 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  * Address to jum
15770 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74  p to for next it
15780 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
15790 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
157a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
157b0 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
157c0 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74  x */.  int iPart
157d0 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  IdxLabel;       
157e0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
157f0 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
15800 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56  kip a row */.  V
15810 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15830 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
15840 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
15850 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
15860 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15880 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
15890 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  x */.  int regRe
158a0 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
158b0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
158c0 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62  r holding assemb
158d0 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  led index record
158e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
158f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
15900 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
15910 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15920 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
15930 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
15940 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
15950 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
15960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15970 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
15980 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
15990 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
159a0 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
159b0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
159c0 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
159d0 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20  .zName ) ){.    
159e0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
159f0 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65  if..  /* Require
15a00 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
15a10 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65   the table to pe
15a20 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61  rform this opera
15a30 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
15a40 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
15a50 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
15a60 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 1, pTab->zNa
15a70 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  me);..  v = sqli
15a80 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
15a90 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
15aa0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d   return;.  if( m
15ab0 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b  emRootPage>=0 ){
15ac0 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52  .    tnum = memR
15ad0 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  ootPage;.  }else
15ae0 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e  {.    tnum = pIn
15af0 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20  dex->tnum;.  }. 
15b00 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
15b10 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
15b20 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 0a  arse, pIndex);..
15b30 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f    /* Open the so
15b40 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20 77  rter cursor if w
15b50 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65  e are to use one
15b60 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d  . */.  iSorter =
15b70 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
15b80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15b90 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
15ba0 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20  rOpen, iSorter, 
15bb0 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  0, pIndex->nKeyC
15bc0 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20  ol, (char*).    
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
15bf0 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49  f(pKey), P4_KEYI
15c00 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  NFO);..  /* Open
15c10 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70   the table. Loop
15c20 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77   through all row
15c30 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  s of the table, 
15c40 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a  inserting index.
15c50 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74    ** records int
15c60 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  o the sorter. */
15c70 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
15c80 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
15c90 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
15ca0 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
15cb0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
15cc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
15cd0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56  ind, iTab, 0); V
15ce0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15cf0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
15d00 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15d10 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69  pParse);..  sqli
15d20 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
15d30 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65  Key(pParse,pInde
15d40 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64  x,iTab,regRecord
15d50 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65  ,0,&iPartIdxLabe
15d60 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65  l,0,0);.  sqlite
15d70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15d80 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
15d90 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
15da0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
15db0 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65  solvePartIdxLabe
15dc0 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74 49  l(pParse, iPartI
15dd0 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  dxLabel);.  sqli
15de0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15df0 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
15e00 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f  addr1+1); VdbeCo
15e10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
15e20 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15e30 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66  (v, addr1);.  if
15e40 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20  ( memRootPage<0 
15e50 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
15e60 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
15e70 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73   tnum, iDb);.  s
15e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15e90 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
15ea0 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44  , iIdx, tnum, iD
15eb0 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  b, .            
15ec0 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29          (char *)
15ed0 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
15ee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15ef0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
15f00 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d  AG_BULKCSR|((mem
15f10 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46  RootPage>=0)?OPF
15f20 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b  LAG_P2ISREG:0));
15f30 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ..  addr1 = sqli
15f40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15f50 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
15f60 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62  iSorter, 0); Vdb
15f70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15f80 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20  assert( pKey!=0 
15f90 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
15fa0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
15fb0 45 72 72 20 29 3b 0a 20 20 69 66 28 20 49 73 55  Err );.  if( IsU
15fc0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
15fd0 78 29 20 26 26 20 70 4b 65 79 21 3d 30 20 29 7b  x) && pKey!=0 ){
15fe0 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
15ff0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16000 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20  Addr(v) + 3;.   
16010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16020 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
16030 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32  , j2);.    addr2
16040 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
16050 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
16060 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16070 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72  Op4Int(v, OP_Sor
16080 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72  terCompare, iSor
16090 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f  ter, j2, regReco
160a0 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
160c0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  dex->nKeyCol); V
160d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
160e0 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75      sqlite3Uniqu
160f0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  eConstraint(pPar
16100 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49  se, OE_Abort, pI
16110 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ndex);.  }else{.
16120 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
16130 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16140 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr(v);.  }.  sql
16150 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
16160 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
16170 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
16180 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ord, iIdx);.  sq
16190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
161a0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
161b0 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64   iIdx, regRecord
161c0 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
161d0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
161e0 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
161f0 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ULT);.  sqlite3R
16200 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16210 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
16220 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16230 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
16240 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c  erNext, iSorter,
16250 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76   addr2); VdbeCov
16260 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
16270 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16280 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71  v, addr1);..  sq
16290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
162a0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
162b0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
162c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
162d0 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ose, iIdx);.  sq
162e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
162f0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f  v, OP_Close, iSo
16300 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rter);.}../*.** 
16310 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70  Allocate heap sp
16320 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49  ace to hold an I
16330 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68  ndex object with
16340 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a   nCol columns..*
16350 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
16360 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  e allocation siz
16370 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  e to provide an 
16380 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74  extra nExtra byt
16390 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20  es.** of 8-byte 
163a0 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66  aligned space af
163b0 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
163c0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
163d0 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
163e0 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65  this extra space
163f0 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f   in *ppExtra..*/
16400 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41  .Index *sqlite3A
16410 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
16420 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
16430 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b,         /* Da
16440 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16450 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c  n */.  i16 nCol,
16460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16470 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
16480 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
16490 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  dex */.  int nEx
164a0 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tra,          /*
164b0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
164c0 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20   of extra space 
164d0 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  to alloc */.  ch
164e0 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  ar **ppExtra    
164f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
16500 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61   the "extra" spa
16510 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ce */.){.  Index
16520 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
16530 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64  /* Allocated ind
16540 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
16550 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
16560 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
16570 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20  space for Index 
16580 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20  object + arrays 
16590 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  */..  nByte = RO
165a0 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
165b0 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  x)) +           
165c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
165d0 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
165e0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
165f0 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b  f(char*)*nCol) +
16600 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
16610 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
16620 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
16630 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a  (sizeof(LogEst)*
16640 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f  (nCol+1) +     /
16650 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67  * Index.aiRowLog
16660 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  Est   */.       
16670 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
16680 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (i16)*nCol +    
16690 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
166a0 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20  .aiColumn   */. 
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166c0 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29  sizeof(u8)*nCol)
166d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
166e0 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
166f0 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  r */.  p = sqlit
16700 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
16710 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72  b, nByte + nExtr
16720 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
16730 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20     char *pExtra 
16740 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55  = ((char*)p)+ROU
16750 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
16760 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c  ));.    p->azCol
16770 6c 20 3d 20 28 63 68 61 72 2a 2a 29 70 45 78 74  l = (char**)pExt
16780 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61  ra;       pExtra
16790 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
167a0 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a  f(char*)*nCol);.
167b0 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45      p->aiRowLogE
167c0 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45  st = (LogEst*)pE
167d0 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
167e0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
167f0 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e  nCol+1);.    p->
16800 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
16810 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70  )pExtra;       p
16820 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
16830 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70  i16)*nCol;.    p
16840 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
16850 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20  u8*)pExtra;.    
16860 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  p->nColumn = nCo
16870 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f  l;.    p->nKeyCo
16880 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  l = nCol - 1;.  
16890 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63    *ppExtra = ((c
168a0 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b  har*)p) + nByte;
168b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
168c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
168d0 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
168e0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
168f0 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
16900 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
16910 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
16920 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
16930 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
16940 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
16950 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
16960 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
16970 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
16980 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
16990 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
169a0 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
169b0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
169c0 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
169d0 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
169e0 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
169f0 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
16a00 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
16a10 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
16a20 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
16a30 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
16a40 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
16a50 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
16a60 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
16a70 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
16a80 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
16a90 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
16aa0 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
16ab0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
16ac0 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
16ad0 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
16ae0 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
16af0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
16b00 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
16b10 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
16b20 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
16b30 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  truction.  .**.*
16b40 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  * If the index i
16b50 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73  s created succes
16b60 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61  sfully, return a
16b70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
16b80 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72  new Index.** str
16b90 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20  ucture. This is 
16ba0 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41  used by sqlite3A
16bb0 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74  ddPrimaryKey() t
16bc0 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78  o mark the index
16bd0 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
16be0 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49  s primary key (I
16bf0 6e 64 65 78 2e 69 64 78 54 79 70 65 3d 3d 53 51  ndex.idxType==SQ
16c00 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
16c10 4d 41 52 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65  MARYKEY).*/.Inde
16c20 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65  x *sqlite3Create
16c30 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
16c40 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
16c50 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
16c60 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
16c70 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
16c80 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
16c90 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
16ca0 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
16cb0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
16cc0 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
16cd0 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
16ce0 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
16cf0 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
16d00 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
16d10 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
16d20 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
16d30 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
16d40 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
16d50 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
16d60 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
16d70 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
16d80 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
16d90 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
16da0 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
16db0 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
16dc0 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
16dd0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
16de0 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
16df0 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ns this statemen
16e00 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49  t */.  Expr *pPI
16e10 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45  Where,    /* WHE
16e20 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61  RE clause for pa
16e30 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f  rtial indices */
16e40 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
16e50 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
16e60 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
16e70 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
16e80 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
16e90 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f  otExist     /* O
16ea0 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
16eb0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
16ec0 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  s */.){.  Index 
16ed0 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f  *pRet = 0;     /
16ee0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74  * Pointer to ret
16ef0 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  urn */.  Table *
16f00 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pTab = 0;     /*
16f10 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
16f20 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
16f30 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f  *pIndex = 0;   /
16f40 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
16f50 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
16f60 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
16f70 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16f80 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
16f90 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
16fa0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16fb0 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e  characters in zN
16fc0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ame */.  int i, 
16fd0 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  j;.  DbFixer sFi
16fe0 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  x;        /* For
16ff0 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62   assigning datab
17000 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61  ase names to pTa
17010 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ble */.  int sor
17020 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a  tOrderMask;   /*
17030 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43   1 to honor DESC
17040 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f   in index.  0 to
17050 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71   ignore. */.  sq
17060 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17070 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44  se->db;.  Db *pD
17080 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
17090 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74  * The specific t
170a0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
170b0 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61  the indexed data
170c0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
170d0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
170e0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
170f0 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
17100 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
17110 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
17120 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  = 0;    /* Unqua
17130 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
17140 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
17150 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  te */.  struct E
17160 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
17170 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20  istItem; /* For 
17180 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69  looping over pLi
17190 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 43 6f  st */.  const Co
171a0 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 20 20  lumn *pTabCol;  
171b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
171c0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
171d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  e */.  int nExtr
171e0 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
171f0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
17200 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a   allocated for z
17210 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Extra[] */.  int
17220 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20   nExtraCol;     
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17240 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
17250 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
17260 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  */.  char *zExtr
17270 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
17280 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
17290 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49  pace after the I
172a0 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
172b0 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b   Index *pPk = 0;
172c0 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59        /* PRIMARY
172d0 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57   KEY index for W
172e0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
172f0 6c 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  les */..  assert
17300 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
17310 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76  0 );      /* Nev
17320 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
17330 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
17340 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
17350 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c  ailed || IN_DECL
17360 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
17370 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17380 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
17390 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
173a0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
173b0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
173c0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
173d0 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
173e0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
173f0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
17400 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
17410 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
17420 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
17430 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
17440 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
17450 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
17460 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
17470 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
17480 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
17490 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
174a0 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
174b0 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
174c0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
174d0 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
174e0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
174f0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
17500 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
17510 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
17520 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
17530 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
17540 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
17550 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
17560 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17570 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
17580 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29  me && pName->z )
17590 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
175a0 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
175b0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
175c0 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
175d0 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
175e0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
175f0 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
17600 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
17610 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
17620 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   Do not do this.
17630 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61      ** if initia
17640 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  lising a databas
17650 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f  e schema..    */
17660 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
17670 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
17680 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
17690 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
176a0 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
176b0 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32        if( pName2
176c0 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
176d0 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d  & pTab->pSchema=
176e0 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
176f0 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ema ){.        i
17700 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Db = 1;.      }.
17710 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
17720 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74    sqlite3FixInit
17730 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
17740 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
17750 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ame);.    if( sq
17760 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
17770 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
17780 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
17790 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
177a0 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
177b0 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
177c0 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
177d0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
177e0 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
177f0 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
17800 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
17810 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
17820 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
17830 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
17840 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29  &pTblName->a[0])
17850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
17860 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
17870 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a  0 || pTab==0 );.
17880 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
17890 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
178a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
178b0 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e  ( iDb==1 && db->
178c0 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
178d0 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  !=pTab->pSchema 
178e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
178f0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17900 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61   .           "ca
17910 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45  nnot create a TE
17920 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d  MP index on non-
17930 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c  TEMP table \"%s\
17940 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  "",.           p
17950 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
17960 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17970 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17980 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
17990 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d  id(pTab) ) pPk =
179a0 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
179b0 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
179c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
179d0 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
179e0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
179f0 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  rt==0 );.    pTa
17a00 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
17a10 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
17a20 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
17a30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17a40 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
17a50 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
17a60 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
17a70 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
17a80 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
17a90 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
17aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
17ab0 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
17ac0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
17ad0 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
17ae0 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
17af0 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 64  ==0 .       && d
17b00 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a  b->init.busy==0.
17b10 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
17b20 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
17b30 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
17b40 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54  UserAuthTable(pT
17b50 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65  ab->zName)==0.#e
17b60 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26 20 73  ndif.       && s
17b70 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26  qlite3StrNICmp(&
17b80 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
17b90 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30  altertab_",9)!=0
17ba0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
17bb0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17bc0 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
17bd0 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70  t be indexed", p
17be0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
17bf0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17c00 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  e_index;.  }.#if
17c10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17c20 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62  _VIEW.  if( pTab
17c30 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
17c40 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17c50 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
17c60 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
17c70 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
17c80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17c90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
17ca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17cb0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
17cc0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
17cd0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
17ce0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17cf0 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c  e, "virtual tabl
17d00 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  es may not be in
17d10 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
17d20 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17d30 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
17d40 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
17d50 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
17d60 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
17d70 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
17d80 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
17d90 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
17da0 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
17db0 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
17dc0 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
17dd0 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
17de0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
17df0 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
17e00 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
17e10 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
17e20 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
17e30 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
17e40 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
17e50 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
17e60 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
17e70 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
17e80 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
17e90 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
17ea0 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
17eb0 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
17ec0 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
17ed0 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
17ee0 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
17ef0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
17f00 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
17f10 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
17f20 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
17f30 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
17f40 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
17f50 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
17f60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
17f70 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
17f80 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
17f90 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
17fa0 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
17fb0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
17fc0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17fd0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
17fe0 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  z!=0 );.    if( 
17ff0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
18000 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
18010 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
18020 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
18030 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18050 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
18060 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
18070 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
18080 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
18090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
180a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
180b0 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
180c0 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
180d0 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
180e0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
180f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18100 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18110 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
18120 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
18130 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
18140 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
18150 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
18160 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18170 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
18180 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
18190 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
181a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
181b0 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
181c0 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
181d0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
181e0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
181f0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
18200 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78   }.      goto ex
18210 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18220 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18230 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49      int n;.    I
18240 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  ndex *pLoop;.   
18250 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d   for(pLoop=pTab-
18260 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c  >pIndex, n=1; pL
18270 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
18280 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a  ->pNext, n++){}.
18290 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
182a0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
182b0 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
182c0 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a  _%s_%d", pTab->z
182d0 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66  Name, n);.    if
182e0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
182f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18300 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18310 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
18320 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74  k for authorizat
18330 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ion to create an
18340 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66   index..  */.#if
18350 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18360 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
18370 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
18380 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e  r *zDb = pDb->zN
18390 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
183a0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
183b0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
183c0 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
183d0 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
183e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
183f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18400 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
18410 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
18420 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
18430 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
18440 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
18450 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
18460 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
18470 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
18480 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
18490 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
184a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
184b0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
184c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
184d0 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
184e0 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
184f0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
18500 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
18510 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
18520 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
18530 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
18540 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
18550 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
18560 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
18570 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
18580 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
18590 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
185a0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
185b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
185c0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
185d0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  0);.    if( pLis
185e0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
185f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18600 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a     pList->a[0].z
18610 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
18620 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
18630 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18650 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
18660 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
18670 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  -1].zName);.    
18680 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
18690 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72 74  Order = (u8)sort
186a0 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
186b0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
186c0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
186d0 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
186e0 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
186f0 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
18700 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
18710 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
18720 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
18730 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
18740 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
18750 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
18760 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
18770 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20   pExpr ){.      
18780 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
18790 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
187a0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d  .      nExtra +=
187b0 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72   (1 + sqlite3Str
187c0 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a  len30(pExpr->u.z
187d0 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20  Token));.    }. 
187e0 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
187f0 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
18800 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
18810 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  */.  nName = sql
18820 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
18830 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c  me);.  nExtraCol
18840 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b   = pPk ? pPk->nK
18850 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e  eyCol : 1;.  pIn
18860 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c  dex = sqlite3All
18870 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
18880 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70  (db, pList->nExp
18890 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20  r + nExtraCol,. 
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188c0 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78       nName + nEx
188d0 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61  tra + 1, &zExtra
188e0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
188f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
18900 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18910 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  e_index;.  }.  a
18920 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
18930 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
18940 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29  ex->aiRowLogEst)
18950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
18960 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
18970 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  NT(pIndex->azCol
18980 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  l) );.  pIndex->
18990 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a  zName = zExtra;.
189a0 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d    zExtra += nNam
189b0 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28  e + 1;.  memcpy(
189c0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
189d0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
189e0 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
189f0 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
18a00 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
18a10 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
18a20 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
18a30 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  = onError!=OE_No
18a40 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64  ne;.  pIndex->id
18a50 78 54 79 70 65 20 3d 20 70 4e 61 6d 65 20 3f 20  xType = pName ? 
18a60 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
18a70 50 50 44 45 46 20 3a 20 53 51 4c 49 54 45 5f 49  PPDEF : SQLITE_I
18a80 44 58 54 59 50 45 5f 55 4e 49 51 55 45 3b 0a 20  DXTYPE_UNIQUE;. 
18a90 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
18aa0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
18ab0 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65  pSchema;.  pInde
18ac0 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69  x->nKeyCol = pLi
18ad0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  st->nExpr;.  if(
18ae0 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20   pPIWhere ){.   
18af0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
18b00 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
18b10 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61  rse, pTab, NC_Pa
18b20 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c  rtIdx, pPIWhere,
18b30 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d   0);.    pIndex-
18b40 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d  >pPartIdxWhere =
18b50 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70   pPIWhere;.    p
18b60 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d  PIWhere = 0;.  }
18b70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18b80 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
18b90 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
18ba0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
18bb0 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
18bc0 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
18bd0 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
18be0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
18bf0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
18c00 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
18c10 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
18c20 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
18c30 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
18c40 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
18c50 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
18c60 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
18c70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  .  }..  /* Scan 
18c80 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
18c90 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
18ca0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
18cb0 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
18cc0 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
18cd0 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
18ce0 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
18cf0 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
18d00 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
18d10 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
18d20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
18d30 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20    Add a test to 
18d40 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
18d50 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
18d60 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 2a 2a  s not named.  **
18d70 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
18d80 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
18d90 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65  index.  Only the
18da0 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20   first instance 
18db0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75  of.  ** the colu
18dc0 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20  mn will ever be 
18dd0 75 73 65 64 20 62 79 20 74 68 65 20 6f 70 74 69  used by the opti
18de0 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61  mizer.  Note tha
18df0 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
18e00 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72   same column mor
18e10 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e  e than once cann
18e20 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20 62  ot be an error b
18e30 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c  ecause that woul
18e40 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20 62 61  d .  ** break ba
18e50 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
18e60 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73  ility - it needs
18e70 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67   to be a warning
18e80 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
18e90 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73  , pListItem=pLis
18ea0 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
18eb0 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74  Expr; i++, pList
18ec0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  Item++){.    con
18ed0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d  st char *zColNam
18ee0 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a  e = pListItem->z
18ef0 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 72 65  Name;.    int re
18f00 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
18f10 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
18f20 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
18f30 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
18f40 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
18f50 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c  */..    for(j=0,
18f60 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61   pTabCol=pTab->a
18f70 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
18f80 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b  l; j++, pTabCol+
18f90 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
18fa0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f  lite3StrICmp(zCo
18fb0 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e  lName, pTabCol->
18fc0 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
18fd0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
18fe0 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   j>=pTab->nCol )
18ff0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
19000 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19010 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f  "table %s has no
19020 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73   column named %s
19030 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
19040 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65  >zName, zColName
19050 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
19060 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
19070 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
19080 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19090 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
190a0 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20  ( j<=0x7fff );. 
190b0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
190c0 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b  umn[i] = (i16)j;
190d0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
190e0 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20 20  em->pExpr ){.   
190f0 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20     int nColl;.  
19100 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
19110 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  tItem->pExpr->op
19120 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  ==TK_COLLATE );.
19130 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c        zColl = pL
19140 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
19150 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
19160 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  nColl = sqlite3S
19170 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b  trlen30(zColl) +
19180 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
19190 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20  ( nExtra>=nColl 
191a0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
191b0 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e  zExtra, zColl, n
191c0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  Coll);.      zCo
191d0 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
191e0 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f     zExtra += nCo
191f0 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  ll;.      nExtra
19200 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d   -= nColl;.    }
19210 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  else{.      zCol
19220 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
19230 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69  ].zColl;.      i
19240 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c  f( !zColl ) zCol
19250 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  l = "BINARY";.  
19260 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
19270 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
19280 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
19290 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
192a0 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  l) ){.      goto
192b0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
192c0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
192d0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
192e0 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
192f0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
19300 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
19310 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
19320 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
19330 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
19340 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65  ] = (u8)requeste
19350 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  dSortOrder;.    
19360 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  if( pTab->aCol[j
19370 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 70  ].notNull==0 ) p
19380 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
19390 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ll = 0;.  }.  if
193a0 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72  ( pPk ){.    for
193b0 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65  (j=0; j<pPk->nKe
193c0 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
193d0 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61    int x = pPk->a
193e0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
193f0 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
19400 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
19410 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
19420 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20  l, x) ){.       
19430 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
19440 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
19450 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
19460 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
19470 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  x;.        pInde
19480 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70  x->azColl[i] = p
19490 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  Pk->azColl[j];. 
194a0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
194b0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
194c0 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
194d0 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ];.        i++;.
194e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
194f0 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e    assert( i==pIn
19500 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  dex->nColumn );.
19510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
19520 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
19530 20 3d 20 2d 31 3b 0a 20 20 20 20 70 49 6e 64 65   = -1;.    pInde
19540 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 22  x->azColl[i] = "
19550 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 20 20 73  BINARY";.  }.  s
19560 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
19570 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69  Est(pIndex);.  i
19580 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
19590 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61  able==0 ) estima
195a0 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e  teIndexWidth(pIn
195b0 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
195c0 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
195d0 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
195e0 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
195f0 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
19600 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
19610 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
19620 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
19630 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
19640 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
19650 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
19660 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
19670 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
19680 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
19690 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
196a0 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
196b0 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
196c0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
196d0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
196e0 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
196f0 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
19700 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
19710 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
19720 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
19730 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
19740 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
19750 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
19760 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
19770 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
19780 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
19790 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
197a0 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
197b0 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
197c0 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
197d0 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
197e0 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
197f0 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
19800 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
19810 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77      **.    ** Tw
19820 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
19830 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
19840 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  nts are consider
19850 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  ed equivalent.  
19860 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73    ** (and thus s
19870 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73  uppressing the s
19880 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20  econd one) even 
19890 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66  if they have dif
198a0 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f  ferent.    ** so
198b0 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a  rt orders..    *
198c0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
198d0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
198e0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
198f0 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f  ces or if the co
19900 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20  lumns of.    ** 
19910 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  the constraint o
19920 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e  ccur in differen
19930 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74  t orders, then t
19940 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  he constraints a
19950 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  re.    ** consid
19960 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e  ered distinct an
19970 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e  d both result in
19980 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
19990 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
199a0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
199b0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
199c0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
199d0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
199e0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
199f0 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71    assert( IsUniq
19a00 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b  ueIndex(pIdx) );
19a10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19a20 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  Idx->idxType!=SQ
19a30 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
19a40 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73  DEF );.      ass
19a50 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64  ert( IsUniqueInd
19a60 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20  ex(pIndex) );.. 
19a70 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e       if( pIdx->n
19a80 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e  KeyCol!=pIndex->
19a90 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e  nKeyCol ) contin
19aa0 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  ue;.      for(k=
19ab0 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; k<pIdx->nKeyC
19ac0 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; k++){.      
19ad0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31    const char *z1
19ae0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
19af0 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20  char *z2;.      
19b00 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f    if( pIdx->aiCo
19b10 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d  lumn[k]!=pIndex-
19b20 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62  >aiColumn[k] ) b
19b30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31  reak;.        z1
19b40 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
19b50 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  k];.        z2 =
19b60 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
19b70 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
19b80 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65  z1!=z2 && sqlite
19b90 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
19ba0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
19bb0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
19bc0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  Idx->nKeyCol ){.
19bd0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
19be0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
19bf0 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
19c00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
19c10 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
19c20 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
19c30 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
19c40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
19c50 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
19c60 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
19c70 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
19c80 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
19c90 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
19ca0 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
19cb0 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
19cc0 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
19cd0 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
19ce0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
19cf0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
19d00 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
19d10 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
19d20 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
19d30 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
19d40 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
19d50 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
19d60 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
19d70 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
19d80 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
19d90 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
19da0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
19db0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
19dc0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
19dd0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
19de0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
19df0 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
19e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19e10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19e30 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
19e40 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
19e50 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
19e60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
19e70 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
19e80 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
19e90 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
19ea0 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
19eb0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
19ec0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
19ed0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
19ee0 20 20 20 20 70 52 65 74 20 3d 20 70 49 64 78 3b      pRet = pIdx;
19ef0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
19f00 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19f20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
19f30 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
19f40 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
19f50 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
19f60 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
19f70 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
19f80 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
19f90 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
19fa0 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
19fb0 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  p;.    assert( s
19fc0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
19fd0 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e  xHeld(db, 0, pIn
19fe0 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  dex->pSchema) );
19ff0 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
1a000 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64  HashInsert(&pInd
1a010 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
1a020 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1a050 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
1a060 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
1a070 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
1a080 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
1a090 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
1a0a0 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
1a0b0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
1a0c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1a0d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1a0e0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
1a0f0 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
1a100 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
1a110 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1a120 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
1a130 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
1a140 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
1a150 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a160 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41  the initial CREA
1a170 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1a180 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41  nt (or CREATE TA
1a190 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  BLE if the.  ** 
1a1a0 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c  index is an impl
1a1b0 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20  ied index for a 
1a1c0 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
1a1d0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1a1e0 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74  ) then.  ** emit
1a1f0 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74   code to allocat
1a200 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74  e the index root
1a210 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64  page on disk and
1a220 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   make an entry f
1a230 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  or.  ** the inde
1a240 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  x in the sqlite_
1a250 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
1a260 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e   populate the in
1a270 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f  dex with.  ** co
1a280 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20  ntent.  But, do 
1a290 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77  not do this if w
1a2a0 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61  e are simply rea
1a2b0 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
1a2c0 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
1a2d0 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73  e to parse the s
1a2e0 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69  chema, or if thi
1a2f0 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50  s index is the P
1a300 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
1a310 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f  .  ** of a WITHO
1a320 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
1a330 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
1a340 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
1a350 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
1a360 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20  generated as an 
1a370 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20  implied PRIMARY 
1a380 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  KEY.  ** or UNIQ
1a390 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52  UE index in a CR
1a3a0 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1a3b0 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
1a3c0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
1a3d0 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
1a3e0 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
1a3f0 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
1a400 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
1a410 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
1a420 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
1a430 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50  */.  else if( pP
1a440 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
1a450 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
1a460 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 29   || pTblName!=0)
1a470 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   ){.    Vdbe *v;
1a480 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
1a490 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
1a4a0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a4b0 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
1a4c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1a4d0 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
1a4e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a4f0 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f  e_index;...    /
1a500 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
1a510 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
1a520 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
1a530 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1a540 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1a550 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
1a560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a570 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
1a580 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
1a590 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
1a5a0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1a5b0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
1a5c0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
1a5d0 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
1a5e0 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
1a5f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
1a600 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  art ){.      int
1a610 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73   n = (int)(pPars
1a620 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20  e->sLastToken.z 
1a630 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50  - pName->z) + pP
1a640 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1a650 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  .n;.      if( pN
1a660 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27  ame->z[n-1]==';'
1a670 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a   ) n--;.      /*
1a680 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
1a690 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
1a6a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1a6b0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
1a6c0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1a6d0 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
1a6e0 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
1a6f0 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
1a700 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
1a710 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20  : " UNIQUE", n, 
1a720 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
1a730 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1a740 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1a750 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
1a760 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1a770 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
1a780 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
1a790 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1a7a0 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
1a7b0 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
1a7c0 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
1a7d0 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
1a7e0 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
1a7f0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
1a800 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1a810 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
1a820 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1a830 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
1a840 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25  'index',%Q,%Q,#%
1a850 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  d,%Q);",.       
1a860 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1a870 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
1a880 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
1a890 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
1a8a0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1a8b0 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d  me,.        iMem
1a8c0 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a  ,.        zStmt.
1a8d0 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
1a8e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
1a8f0 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
1a900 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
1a910 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
1a920 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
1a930 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
1a940 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
1a950 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
1a960 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
1a970 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a980 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
1a990 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1a9a0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1a9b0 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
1a9c0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1a9d0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1a9e0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
1a9f0 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
1aa00 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
1aa10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1aa20 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
1aa30 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
1aa40 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d  index'", pIndex-
1aa50 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
1aa60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aa70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
1aa80 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
1aa90 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
1aaa0 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
1aab0 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
1aac0 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
1aad0 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
1aae0 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
1aaf0 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
1ab00 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
1ab10 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
1ab20 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
1ab30 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
1ab40 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
1ab50 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
1ab60 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
1ab70 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
1ab80 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
1ab90 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
1aba0 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
1abb0 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
1abc0 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
1abd0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
1abe0 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
1abf0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
1ac00 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
1ac10 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
1ac20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
1ac30 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1ac40 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
1ac50 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1ac60 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1ac70 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
1ac80 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1ac90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1aca0 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
1acb0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1acc0 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
1acd0 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
1ace0 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
1acf0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
1ad00 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
1ad10 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1ad20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad30 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1ad40 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1ad50 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
1ad60 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
1ad70 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e  }.    pRet = pIn
1ad80 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
1ad90 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1ada0 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
1adb0 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
1adc0 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
1add0 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65  f( pIndex ) free
1ade0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1adf0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1ae00 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1ae10 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1ae20 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1ae30 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1ae40 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1ae50 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1ae60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1ae70 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
1ae80 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1ae90 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1aea0 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1aeb0 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1aec0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1aed0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1aee0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1aef0 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1af00 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1af10 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1af20 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64  t[0] is supposed
1af30 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1af40 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1af50 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
1af60 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
1af70 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
1af80 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
1af90 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
1afa0 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
1afb0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1afc0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
1afd0 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1afe0 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
1aff0 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
1b000 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1b010 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
1b020 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1b030 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1b040 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
1b050 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1b060 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1b070 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1b080 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1b090 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1b0a0 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1b0b0 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1b0c0 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1b0d0 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1b0e0 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1b0f0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1b100 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1b110 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1b120 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1b130 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1b140 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1b150 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1b160 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1b170 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1b180 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1b190 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1b1a0 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1b1b0 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1b1c0 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1b1d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1b1e0 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1b1f0 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20  x *pIdx){.  /*  
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
1b210 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36  ,  9,  8,  7,  6
1b220 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61   */.  LogEst aVa
1b230 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20  l[] = { 33, 32, 
1b240 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20  30, 28, 26 };.  
1b250 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78  LogEst *a = pIdx
1b260 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  ->aiRowLogEst;. 
1b270 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1b280 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29  (ArraySize(aVal)
1b290 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
1b2a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1b2b0 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65   Set the first e
1b2c0 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20  ntry (number of 
1b2d0 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
1b2e0 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  x) to the estima
1b2f0 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  ted .  ** number
1b300 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1b310 74 61 62 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66  table. Or 10, if
1b320 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
1b330 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20  umber of rows . 
1b340 20 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65   ** in the table
1b350 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1b360 61 74 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d  at.  */.  a[0] =
1b370 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
1b380 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28  RowLogEst;.  if(
1b390 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1b3a0 3d 20 33 33 3b 20 20 20 20 20 20 20 20 61 73 73  = 33;        ass
1b3b0 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33  ert( 33==sqlite3
1b3c0 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20  LogEst(10) );.. 
1b3d0 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61   /* Estimate tha
1b3e0 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b  t a[1] is 10, a[
1b3f0 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73  2] is 9, a[3] is
1b400 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61   8, a[4] is 7, a
1b410 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e  [5] is.  ** 6 an
1b420 64 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  d each subsequen
1b430 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29  t value (if any)
1b440 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d   is 5.  */.  mem
1b450 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c  cpy(&a[1], aVal,
1b460 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f   nCopy*sizeof(Lo
1b470 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d  gEst));.  for(i=
1b480 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78  nCopy+1; i<=pIdx
1b490 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
1b4a0 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20  .    a[i] = 23; 
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73     assert( 23==s
1b4d0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20  qlite3LogEst(5) 
1b4e0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1b4f0 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
1b500 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49  st(1) );.  if( I
1b510 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1b520 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65  x) ) a[pIdx->nKe
1b530 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  yCol] = 0;.}../*
1b540 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b550 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
1b560 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
1b570 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
1b580 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
1b590 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
1b5a0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
1b5b0 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
1b5c0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1b5d0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
1b5e0 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b  , int ifExists){
1b5f0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1b600 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
1b610 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1b620 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1b630 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Db;..  assert( p
1b640 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1b650 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c  ;   /* Never cal
1b660 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
1b670 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
1b680 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b690 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1b6a0 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1b6b0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
1b6c0 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
1b6d0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1b6e0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1b6f0 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
1b700 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1b710 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
1b720 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1b730 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
1b740 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
1b750 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1b760 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
1b770 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ==0 ){.    if( !
1b780 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ifExists ){.    
1b790 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b7a0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1b7b0 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
1b7c0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Name, 0);.    }e
1b7d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1b7e0 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
1b7f0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
1b800 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1b810 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  abase);.    }.  
1b820 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1b830 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
1b840 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1b850 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
1b860 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d  Index->idxType!=
1b870 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1b880 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c  PPDEF ){.    sql
1b890 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b8a0 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
1b8b0 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
1b8c0 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
1b8d0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1b8e0 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
1b8f0 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
1b900 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1b910 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
1b920 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1b930 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
1b940 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
1b950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b960 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1b970 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
1b980 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1b990 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
1b9a0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
1b9b0 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
1b9c0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
1b9d0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1b9e0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1b9f0 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
1ba00 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
1ba10 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1ba20 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1ba30 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
1ba40 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
1ba50 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1ba60 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1ba70 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1ba80 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
1ba90 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1baa0 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1bab0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1bac0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
1bad0 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
1bae0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1baf0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1bb00 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1bb10 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1bb20 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
1bb30 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
1bb40 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
1bb50 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
1bb60 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
1bb70 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1bb80 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1bb90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1bba0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1bbb0 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1bbc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
1bbd0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1bbe0 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
1bbf0 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
1bc00 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
1bc10 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
1bc20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1bc30 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
1bc40 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65  ABLE(iDb), pInde
1bc50 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
1bc60 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
1bc70 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
1bc80 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70  e, iDb, "idx", p
1bc90 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Index->zName);. 
1bca0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1bcb0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1bcc0 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
1bcd0 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
1bce0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
1bcf0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1bd00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1bd10 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
1bd20 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
1bd30 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
1bd40 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
1bd50 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1bd60 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
1bd70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
1bd80 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
1bd90 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
1bda0 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a  bjects. Each obj
1bdb0 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ect in the.** ar
1bdc0 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62  ray is szEntry b
1bdd0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
1bde0 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20  is routine uses 
1bdf0 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1be00 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20  ().** to extend 
1be10 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61  the array so tha
1be20 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65  t there is space
1be30 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63   for a new objec
1be40 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  t at the end..**
1be50 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
1be60 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1be70 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61  , *pnEntry conta
1be80 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ins the current 
1be90 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61  size of.** the a
1bea0 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73  rray (in entries
1beb0 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61   - so the alloca
1bec0 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74  tion is ((*pnEnt
1bed0 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62  ry) * szEntry) b
1bee0 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c  ytes.** in total
1bef0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1bf00 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63  realloc() is suc
1bf10 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66  cessful (i.e. if
1bf20 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   no OOM conditio
1bf30 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a  n occurs), the.*
1bf40 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * space allocate
1bf50 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62  d for the new ob
1bf60 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20  ject is zeroed, 
1bf70 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64  *pnEntry updated
1bf80 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74   to.** reflect t
1bf90 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74  he new size of t
1bfa0 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70  he array and a p
1bfb0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1bfc0 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  w allocation.** 
1bfd0 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20  returned. *pIdx 
1bfe0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
1bff0 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61  dex of the new a
1c000 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68  rray entry in th
1c010 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f  is case..**.** O
1c020 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1c030 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73   realloc() fails
1c040 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  , *pIdx is set t
1c050 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72  o -1, *pnEntry r
1c060 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e  emains.** unchan
1c070 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  ged and a copy o
1c080 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65  f pArray returne
1c090 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
1c0a0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1c0b0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1c0c0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1c0d0 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1c0e0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1c0f0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72   */.  void *pArr
1c100 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ay,     /* Array
1c110 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69   of objects.  Mi
1c120 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ght be reallocat
1c130 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e  ed */.  int szEn
1c140 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a  try,      /* Siz
1c150 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74  e of each object
1c160 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
1c170 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c  .  int *pnEntry,
1c180 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c190 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e  f objects curren
1c1a0 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  tly in use */.  
1c1b0 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
1c1c0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
1c1d0 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
1c1e0 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
1c1f0 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
1c200 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69   = *pnEntry;.  i
1c210 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d  f( (n & (n-1))==
1c220 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  0 ){.    int sz 
1c230 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32  = (n==0) ? 1 : 2
1c240 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e  *n;.    void *pN
1c250 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
1c260 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79  alloc(db, pArray
1c270 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20  , sz*szEntry);. 
1c280 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1c290 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  {.      *pIdx = 
1c2a0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1c2b0 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20   pArray;.    }. 
1c2c0 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
1c2d0 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
1c2e0 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
1c2f0 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74  set(&z[n * szEnt
1c300 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
1c310 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20  ;.  *pIdx = n;. 
1c320 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72   ++*pnEntry;.  r
1c330 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a  eturn pArray;.}.
1c340 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1c350 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
1c360 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
1c370 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
1c380 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
1c390 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
1c3a0 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
1c3b0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1c3c0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1c3d0 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
1c3e0 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73  e3IdListAppend(s
1c3f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
1c400 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
1c410 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74   *pToken){.  int
1c420 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1c430 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1c440 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1c450 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1c460 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  (IdList) );.    
1c470 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1c480 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1c490 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
1c4a0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1c4b0 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
1c4c0 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20  pList->a,.      
1c4d0 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1c4e0 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  0]),.      &pLis
1c4f0 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69  t->nId,.      &i
1c500 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
1c510 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
1c520 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1c530 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1c540 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1c550 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1c560 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1c570 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
1c580 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1c590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1c5a0 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
1c5b0 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
1c5c0 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1c5d0 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1c5e0 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1c5f0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1c600 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1c610 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1c620 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1c630 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1c640 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1c650 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1c660 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1c670 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1c680 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
1c690 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1c6a0 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
1c6b0 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
1c6c0 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
1c6d0 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
1c6e0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
1c6f0 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
1c700 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
1c710 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1c720 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
1c730 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1c740 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
1c750 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1c760 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1c770 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1c780 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
1c790 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1c7a0 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1c7b0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1c7c0 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
1c7d0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1c7e0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
1c7f0 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
1c800 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
1c810 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
1c820 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
1c830 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
1c840 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
1c850 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
1c860 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1c870 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
1c880 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
1c890 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
1c8a0 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
1c8b0 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
1c8c0 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
1c8d0 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
1c8e0 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
1c8f0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1c900 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
1c910 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
1c920 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
1c930 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
1c940 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
1c950 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
1c960 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
1c970 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
1c980 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
1c990 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
1c9a0 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
1c9b0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1c9c0 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
1c9d0 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
1c9e0 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
1c9f0 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
1ca00 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
1ca10 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
1ca20 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
1ca30 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
1ca40 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
1ca50 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
1ca60 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
1ca70 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
1ca80 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
1ca90 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
1caa0 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1cab0 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1cac0 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
1cad0 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
1cae0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1caf0 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
1cb00 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
1cb10 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1cb20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
1cb30 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
1cb40 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1cb50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1cb60 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
1cb70 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
1cb80 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
1cb90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1cba0 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
1cbb0 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
1cbc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1cbd0 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
1cbe0 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
1cbf0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1cc00 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
1cc10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1cc20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
1cc30 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1cc40 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1cc50 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
1cc60 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1cc70 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
1cc80 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
1cc90 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
1cca0 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
1ccb0 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1ccc0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
1ccd0 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1cce0 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1ccf0 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
1cd00 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1cd10 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1cd20 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
1cd30 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
1cd40 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
1cd50 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
1cd60 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
1cd70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1cd80 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1cd90 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1cda0 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
1cdb0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
1cdc0 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
1cdd0 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
1cde0 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
1cdf0 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
1ce00 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
1ce10 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
1ce20 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a  >nAlloc = nGot;.
1ce30 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
1ce40 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
1ce50 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
1ce60 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
1ce70 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
1ce80 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
1ce90 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1cea0 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
1ceb0 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
1cec0 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
1ced0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
1cee0 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78  Src->nSrc += nEx
1cef0 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
1cf00 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1cf10 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
1cf20 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
1cf30 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
1cf40 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
1cf50 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
1cf60 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
1cf70 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
1cf80 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
1cf90 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
1cfa0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
1cfb0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
1cfc0 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
1cfd0 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
1cfe0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
1cff0 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
1d000 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
1d010 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
1d020 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
1d030 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
1d040 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
1d050 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
1d060 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62  ist even if pTab
1d070 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  le is NULL..**.*
1d080 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
1d090 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1d0a0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1d0b0 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20  OOM error.  The 
1d0c0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
1d0d0 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
1d0e0 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
1d0f0 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
1d100 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
1d110 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
1d120 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
1d130 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
1d140 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
1d150 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
1d160 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
1d170 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1d180 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
1d190 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
1d1a0 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
1d1b0 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
1d1c0 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
1d1d0 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
1d1e0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
1d1f0 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
1d200 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
1d210 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
1d220 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
1d230 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
1d240 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
1d250 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
1d260 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
1d270 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
1d280 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
1d290 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
1d2a0 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
1d2b0 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
1d2c0 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
1d2d0 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
1d2e0 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
1d2f0 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
1d300 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
1d310 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
1d320 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1d330 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
1d340 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
1d350 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
1d360 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
1d370 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1d380 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
1d390 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1d3a0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1d3b0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
1d3c0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
1d3d0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
1d3e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1d3f0 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
1d400 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
1d410 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1d420 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1d430 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1d440 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
1d450 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
1d460 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
1d470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1d480 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
1d490 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
1d4a0 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
1d4b0 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
1d4c0 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
1d4d0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
1d4e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1d4f0 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
1d500 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
1d510 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
1d520 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
1d530 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
1d540 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
1d550 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
1d560 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
1d570 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
1d580 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1d590 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
1d5a0 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
1d5b0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1d5c0 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1d5d0 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
1d5e0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
1d5f0 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
1d600 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
1d610 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
1d620 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
1d630 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
1d640 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
1d650 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1d660 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
1d670 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
1d680 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
1d690 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1d6a0 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1d6b0 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c   pDatabase==0 ||
1d6c0 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f   pTable!=0 );  /
1d6d0 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20  * Cannot have C 
1d6e0 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69  without B */.  i
1d6f0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1d700 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1d710 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1d720 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  b, sizeof(SrcLis
1d730 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1d740 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1d750 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
1d760 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lloc = 1;.  }.  
1d770 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53  pList = sqlite3S
1d780 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1d790 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73  , pList, 1, pLis
1d7a0 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28 20  t->nSrc);.  if( 
1d7b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d7c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1d7d0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1d7e0 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1d7f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74  urn 0;.  }.  pIt
1d800 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
1d810 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  List->nSrc-1];. 
1d820 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
1d830 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
1d840 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
1d850 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
1d860 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ( pDatabase ){. 
1d870 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
1d880 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
1d890 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
1d8a0 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
1d8b0 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70  = pTemp;.  }.  p
1d8c0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
1d8d0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1d8e0 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  en(db, pTable);.
1d8f0 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
1d900 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
1d910 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
1d920 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75  atabase);.  retu
1d930 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
1d940 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75  ** Assign VdbeCu
1d950 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65  rsor index numbe
1d960 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
1d970 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
1d980 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1d990 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1d9a0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1d9b0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1d9c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1d9d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d9e0 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1d9f0 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73  t(pList || pPars
1da00 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1da10 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
1da20 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
1da30 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
1da40 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
1da50 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1da60 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1da70 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
1da80 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
1da90 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
1daa0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1dab0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
1dac0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
1dad0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1dae0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
1daf0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
1db00 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
1db10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1db20 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1db30 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
1db40 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
1db50 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
1db60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1db70 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  rcListDelete(sql
1db80 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
1db90 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1dba0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
1dbb0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1dbc0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1dbd0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1dbe0 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1dbf0 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
1dc00 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1dc10 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
1dc20 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1dc30 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
1dc40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1dc50 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
1dc60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1dc70 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1dc80 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69  Alias);.    sqli
1dc90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1dca0 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
1dcb0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
1dcc0 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  able(db, pItem->
1dcd0 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
1dce0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1dcf0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
1dd00 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1dd10 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
1dd20 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
1dd30 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1dd40 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
1dd50 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
1dd60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1dd70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1dd80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1dd90 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1dda0 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
1ddb0 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
1ddc0 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
1ddd0 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
1dde0 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
1ddf0 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
1de00 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
1de10 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
1de20 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
1de30 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
1de40 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
1de50 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1de60 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1de70 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
1de80 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
1de90 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
1dea0 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
1deb0 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
1dec0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1ded0 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
1dee0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
1def0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
1df00 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
1df10 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
1df20 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
1df30 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
1df40 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
1df50 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
1df60 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
1df70 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
1df80 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
1df90 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
1dfa0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1dfb0 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
1dfc0 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
1dfd0 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
1dfe0 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
1dff0 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
1e000 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
1e010 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
1e020 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
1e030 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
1e040 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
1e050 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
1e060 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
1e070 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
1e080 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
1e090 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
1e0a0 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
1e0b0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1e0c0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
1e0d0 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
1e0e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1e0f0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1e100 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1e110 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
1e120 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
1e130 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
1e140 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
1e150 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
1e160 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
1e170 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1e180 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
1e190 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1e1a0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1e1b0 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
1e1c0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1e1d0 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1e1e0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
1e1f0 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
1e200 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1e210 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
1e220 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
1e230 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1e240 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
1e250 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
1e260 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
1e270 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1e280 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
1e290 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e2a0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
1e2b0 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
1e2c0 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
1e2d0 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
1e2e0 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1e2f0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1e300 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1e310 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1e320 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1e330 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
1e340 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
1e350 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e360 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
1e370 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
1e380 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
1e390 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
1e3a0 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
1e3b0 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
1e3c0 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1e3d0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
1e3e0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e3f0 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
1e400 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
1e410 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
1e420 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20  p->nSrc==0) ){. 
1e430 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1e440 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1e450 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
1e460 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73  ->nSrc-1];.  ass
1e470 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29  ert( pAlias!=0 )
1e480 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e  ;.  if( pAlias->
1e490 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
1e4a0 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
1e4b0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1e4c0 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
1e4d0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1e4e0 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
1e4f0 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
1e500 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
1e510 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
1e520 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f  urn p;.. append_
1e530 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73  from_error:.  as
1e540 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
1e550 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1e560 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71  e(db, pOn);.  sq
1e570 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1e580 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
1e590 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1e5a0 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65  lete(db, pSubque
1e5b0 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ry);.  return 0;
1e5c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1e5d0 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
1e5e0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1e5f0 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
1e600 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
1e610 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
1e620 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
1e630 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1e640 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
1e650 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1e660 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
1e670 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1e680 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
1e690 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65  dexedBy){.  asse
1e6a0 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d  rt( pIndexedBy!=
1e6b0 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0 );.  if( p && 
1e6c0 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30  ALWAYS(p->nSrc>0
1e6d0 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
1e6e0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1e6f0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1e700 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
1e710 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e  rt( pItem->notIn
1e720 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74 65  dexed==0 && pIte
1e730 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  m->zIndex==0 );.
1e740 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65 64      if( pIndexed
1e750 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e  By->n==1 && !pIn
1e760 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20  dexedBy->z ){.  
1e770 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e      /* A "NOT IN
1e780 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77 61  DEXED" clause wa
1e790 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20  s supplied. See 
1e7a0 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a  parse.y .      *
1e7b0 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64  * construct "ind
1e7c0 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65  exed_opt" for de
1e7d0 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1e7e0 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  pItem->notIndexe
1e7f0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
1e800 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a  {.      pItem->z
1e810 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 4e  Index = sqlite3N
1e820 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
1e830 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65  rse->db, pIndexe
1e840 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dBy);.    }.  }.
1e850 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75  }../*.** When bu
1e860 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d  ilding up a FROM
1e870 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70   clause in the p
1e880 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20  arser, the join 
1e890 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  operator.** is i
1e8a0 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65  nitially attache
1e8b0 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70  d to the left op
1e8c0 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20  erand.  But the 
1e8d0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
1e8e0 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f  * expects the jo
1e8f0 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  in operator to b
1e900 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f  e on the right o
1e910 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
1e920 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20  utine.** Shifts 
1e930 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  all join operato
1e940 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  rs from left to 
1e950 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74  right for an ent
1e960 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75  ire FROM.** clau
1e970 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  se..**.** Exampl
1e980 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a  e: Suppose the j
1e990 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73  oin is like this
1e9a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1e9b0 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73    A natural cros
1e9c0 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54  s join B.**.** T
1e9d0 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22  he operator is "
1e9e0 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1e9f0 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20  in".  The A and 
1ea00 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73  B operands are s
1ea10 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61  tored.** in p->a
1ea20 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c  [0] and p->a[1],
1ea30 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
1ea40 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69  The parser initi
1ea50 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a  ally stores the.
1ea60 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  ** operator with
1ea70 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   A.  This routin
1ea80 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70  e shifts that op
1ea90 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42  erator over to B
1eaa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1eab0 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69  3SrcListShiftJoi
1eac0 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70  nType(SrcList *p
1ead0 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
1eae0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
1eaf0 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e  (i=p->nSrc-1; i>
1eb00 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70  0; i--){.      p
1eb10 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20  ->a[i].jointype 
1eb20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e  = p->a[i-1].join
1eb30 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  type;.    }.    
1eb40 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65  p->a[0].jointype
1eb50 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
1eb60 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  ** Begin a trans
1eb70 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
1eb80 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
1eb90 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
1eba0 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
1ebb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1ebc0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
1ebd0 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
1ebe0 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62  Parse!=0 );.  db
1ebf0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1ec00 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
1ec10 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44  ;./*  if( db->aD
1ec20 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65  b[0].pBt==0 ) re
1ec30 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73  turn; */.  if( s
1ec40 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1ec50 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
1ec60 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
1ec70 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IN", 0, 0) ){.  
1ec80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ec90 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1eca0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1ecb0 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
1ecc0 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
1ecd0 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
1ece0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1ecf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1ed00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ed10 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
1ed20 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
1ed30 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
1ed40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ed50 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b  UsesBtree(v, i);
1ed60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1ed70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ed80 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
1ed90 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
1eda0 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61   Commit a transa
1edb0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
1edc0 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
1edd0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
1ede0 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
1edf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1ee00 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
1ee10 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
1ee20 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
1ee30 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1ee40 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1ee50 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
1ee60 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
1ee70 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
1ee80 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1ee90 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1eea0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1eeb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1eec0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
1eed0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1eee0 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
1eef0 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
1ef00 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
1ef10 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1ef20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
1ef30 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
1ef40 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
1ef50 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
1ef60 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  b!=0 );.  if( sq
1ef70 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1ef80 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
1ef90 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c  ANSACTION, "ROLL
1efa0 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a  BACK", 0, 0) ){.
1efb0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1efc0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1efd0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1efe0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
1eff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f000 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c  , OP_AutoCommit,
1f010 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   1, 1);.  }.}../
1f020 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f030 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
1f040 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20  the parser when 
1f050 69 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d  it parses a comm
1f060 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a  and to create,.*
1f070 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  * release or rol
1f080 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76  lback an SQL sav
1f090 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64  epoint. .*/.void
1f0a0 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e   sqlite3Savepoin
1f0b0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
1f0c0 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a   int op, Token *
1f0d0 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
1f0e0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1f0f0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
1f100 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b  rse->db, pName);
1f110 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
1f120 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
1f130 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1f140 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
1f150 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1f160 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74  IZATION.    stat
1f170 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
1f180 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22  const az[] = { "
1f190 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45  BEGIN", "RELEASE
1f1a0 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b  ", "ROLLBACK" };
1f1b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41  .    assert( !SA
1f1c0 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26  VEPOINT_BEGIN &&
1f1d0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1f1e0 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49  SE==1 && SAVEPOI
1f1f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29  NT_ROLLBACK==2 )
1f200 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1f210 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75   !v || sqlite3Au
1f220 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1f230 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
1f240 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c  , az[op], zName,
1f250 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   0) ){.      sql
1f260 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
1f270 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
1f280 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1f290 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1f2a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
1f2b0 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c  avepoint, op, 0,
1f2c0 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59   0, zName, P4_DY
1f2d0 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
1f2e0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1f2f0 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
1f300 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61   is open and ava
1f310 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20  ilable for use. 
1f320 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
1f330 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
1f340 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f    Leave any erro
1f350 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68  r messages in th
1f360 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
1f370 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
1f380 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
1f390 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1f3a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1f3b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1f3c0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
1f3d0 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
1f3e0 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
1f3f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
1f400 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74  ree *pBt;.    st
1f410 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66  atic const int f
1f420 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20  lags = .        
1f430 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1f440 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20  ADWRITE |.      
1f450 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1f460 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
1f470 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1f480 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
1f490 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1f4a0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
1f4b0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1f4c0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
1f4d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f4e0 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
1f4f0 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74  Vfs, 0, db, &pBt
1f500 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  , 0, flags);.   
1f510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1f530 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f540 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
1f550 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
1f560 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
1f570 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
1f580 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
1f590 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
1f5a0 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
1f5b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1f5c0 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44      }.    db->aD
1f5d0 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a  b[1].pBt = pBt;.
1f5e0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1f5f0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
1f600 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
1f610 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42  _NOMEM==sqlite3B
1f620 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
1f630 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67  pBt, db->nextPag
1f640 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b  esize, -1, 0) ){
1f650 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
1f660 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
1f670 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f680 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f690 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  0;.}../*.** Reco
1f6a0 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
1f6b0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
1f6c0 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ie will need to 
1f6d0 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66  be verified.** f
1f6e0 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  or database iDb.
1f6f0 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63    The code to ac
1f700 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68  tually verify th
1f710 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a  e schema cookie.
1f720 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74  ** will occur at
1f730 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1f740 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61  top-level VDBE a
1f750 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  nd will be gener
1f760 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62  ated.** later, b
1f770 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  y sqlite3FinishC
1f780 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
1f790 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1f7a0 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
1f7b0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
1f7c0 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1f7d0 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1f7e0 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1f7f0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se);.  sqlite3 *
1f800 64 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  db = pToplevel->
1f810 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  db;..  assert( i
1f820 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
1f830 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
1f840 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
1f850 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
1f860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
1f870 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  <SQLITE_MAX_ATTA
1f880 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65  CHED+2 );.  asse
1f890 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
1f8a0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
1f8b0 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20  Db, 0) );.  if( 
1f8c0 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c  DbMaskTest(pTopl
1f8d0 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
1f8e0 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20  , iDb)==0 ){.   
1f8f0 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
1f900 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
1f910 2c 20 69 44 62 29 3b 0a 20 20 20 20 70 54 6f 70  , iDb);.    pTop
1f920 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c  level->cookieVal
1f930 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44  ue[iDb] = db->aD
1f940 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
1f950 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20  schema_cookie;. 
1f960 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1f970 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
1f980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
1f990 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
1f9a0 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  Toplevel);.    }
1f9b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
1f9c0 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73   argument zDb is
1f9d0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c   NULL, then call
1f9e0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1f9f0 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65  fySchema() for e
1fa00 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  ach .** attached
1fa10 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72   database. Other
1fa20 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20  wise, invoke it 
1fa30 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
1fa40 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e   named zDb only.
1fa50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fa60 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
1fa70 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
1fa80 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1fa90 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  *zDb){.  sqlite3
1faa0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1fab0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  b;.  int i;.  fo
1fac0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1fad0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
1fae0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
1faf0 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
1fb00 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20  pBt && (!zDb || 
1fb10 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
1fb20 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d  p(zDb, pDb->zNam
1fb30 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e)) ){.      sql
1fb40 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
1fb50 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
1fb60 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1fb70 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
1fb80 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
1fb90 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
1fba0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
1fbb0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
1fbc0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1fbd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1fbe0 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
1fbf0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
1fc00 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
1fc10 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
1fc20 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
1fc30 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
1fc40 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
1fc50 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
1fc60 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
1fc70 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
1fc80 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
1fc90 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
1fca0 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
1fcb0 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
1fcc0 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
1fcd0 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
1fce0 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
1fcf0 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
1fd00 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
1fd10 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
1fd20 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
1fd30 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
1fd40 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
1fd50 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
1fd60 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
1fd70 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
1fd80 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
1fd90 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
1fda0 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
1fdb0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1fdc0 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
1fdd0 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
1fde0 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
1fdf0 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
1fe00 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
1fe10 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
1fe20 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1fe30 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
1fe40 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
1fe50 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
1fe60 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
1fe70 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1fe80 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1fe90 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
1fea0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1feb0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1fec0 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
1fed0 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c  evel->writeMask,
1fee0 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76   iDb);.  pToplev
1fef0 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
1ff00 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74   |= setStatement
1ff10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
1ff20 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ate that the sta
1ff30 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  tement currently
1ff40 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1ff50 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a  ion might write.
1ff60 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
1ff70 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a   entry (example:
1ff80 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f   deleting one ro
1ff90 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  w then inserting
1ffa0 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73   another,.** ins
1ffb0 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  erting multiple 
1ffc0 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c  rows in a table,
1ffd0 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20   or inserting a 
1ffe0 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  row and index en
1fff0 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e  tries.).** If an
20000 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66   abort occurs af
20010 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73  ter some of thes
20020 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f  e writes have co
20030 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74  mpleted, then it
20040 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65   will.** be nece
20050 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68  ssary to undo th
20060 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74  e completed writ
20070 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
20080 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61  te3MultiWrite(Pa
20090 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
200a0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
200b0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
200c0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
200d0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
200e0 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a  MultiWrite = 1;.
200f0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  }../* .** The co
20100 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c  de generator cal
20110 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
20120 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20  if is discovers 
20130 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f  that it is.** po
20140 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20  ssible to abort 
20150 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f  a statement prio
20160 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  r to completion.
20170 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a    In order to .*
20180 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61  * perform this a
20190 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72  bort without cor
201a0 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61  rupting the data
201b0 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  base, we need to
201c0 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68   make.** sure th
201d0 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
201e0 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
201f0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
20200 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
20210 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20  Technically, we 
20220 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74  only need to set
20230 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c   the mayAbort fl
20240 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d  ag if the.** isM
20250 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77  ultiWrite flag w
20260 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
20270 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74  t.  There is a t
20280 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
20290 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  * such that the 
202a0 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72  abort must occur
202b0 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69   after the multi
202c0 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b  write.  This mak
202d0 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65  es.** some state
202e0 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20  ments involving 
202f0 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66  the REPLACE conf
20300 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
20310 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20  algorithm.** go 
20320 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e  a little faster.
20330 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76    But taking adv
20340 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74  antage of this t
20350 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
20360 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20  * makes it more 
20370 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f  difficult to pro
20380 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  ve that the code
20390 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20   is correct (in 
203a0 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20  .** particular, 
203b0 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  it prevents us f
203c0 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65  rom writing an e
203d0 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c  ffective.** impl
203e0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71  ementation of sq
203f0 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
20400 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65  ort()) and so we
20410 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20   have chosen.** 
20420 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65  to take the safe
20430 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20   route and skip 
20440 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
20450 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20460 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20  3MayAbort(Parse 
20470 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
20480 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
20490 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
204a0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
204b0 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f  Toplevel->mayAbo
204c0 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rt = 1;.}../*.**
204d0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
204e0 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65   that causes the
204f0 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20   vdbe to return 
20500 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  an SQLITE_CONSTR
20510 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54  AINT.** error. T
20520 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d  he onError param
20530 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
20540 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f  which (if any) o
20550 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  f the statement.
20560 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e  ** and/or curren
20570 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
20580 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
20590 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c  .void sqlite3Hal
205a0 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  tConstraint(.  P
205b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
205c0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
205d0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ext */.  int err
205e0 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78  Code,      /* ex
205f0 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64  tended error cod
20600 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  e */.  int onErr
20610 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
20620 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
20630 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20   char *p4,      
20640 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
20650 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79  age */.  i8 p4ty
20660 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34  pe,        /* P4
20670 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52  _STATIC or P4_TR
20680 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20  ANSIENT */.  u8 
20690 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f  p5Errmsg       /
206a0 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65  * P5_ErrMsg type
206b0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
206c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
206d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
206e0 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78  ert( (errCode&0x
206f0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
20700 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20  TRAINT );.  if( 
20710 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72  onError==OE_Abor
20720 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
20730 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
20740 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
20750 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
20760 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f  Halt, errCode, o
20770 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70  nError, 0, p4, p
20780 34 74 79 70 65 29 3b 0a 20 20 69 66 28 20 70 35  4type);.  if( p5
20790 45 72 72 6d 73 67 20 29 20 73 71 6c 69 74 65 33  Errmsg ) sqlite3
207a0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
207b0 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a  p5Errmsg);.}../*
207c0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
207d0 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55  alt due to UNIQU
207e0 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
207f0 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
20800 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
20810 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
20820 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
20830 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
20840 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20850 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
20860 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
20870 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e  int type */.  In
20880 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
20890 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
208a0 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63  t triggers the c
208b0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
208c0 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
208d0 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75  int j;.  StrAccu
208e0 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c  m errMsg;.  Tabl
208f0 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  e *pTab = pIdx->
20900 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74  pTable;..  sqlit
20910 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
20920 65 72 72 4d 73 67 2c 20 30 2c 20 30 2c 20 32 30  errMsg, 0, 0, 20
20930 30 29 3b 0a 20 20 65 72 72 4d 73 67 2e 64 62 20  0);.  errMsg.db 
20940 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
20950 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
20960 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  >nKeyCol; j++){.
20970 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d      char *zCol =
20980 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78   pTab->aCol[pIdx
20990 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a  ->aiColumn[j]].z
209a0 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6a 20  Name;.    if( j 
209b0 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
209c0 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c  mAppend(&errMsg,
209d0 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 73   ", ", 2);.    s
209e0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
209f0 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c  pendAll(&errMsg,
20a00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
20a10 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
20a20 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67  umAppend(&errMsg
20a30 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 73  , ".", 1);.    s
20a40 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
20a50 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c  pendAll(&errMsg,
20a60 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 7a 45   zCol);.  }.  zE
20a70 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41  rr = sqlite3StrA
20a80 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d  ccumFinish(&errM
20a90 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61  sg);.  sqlite3Ha
20aa0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
20ab0 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d  rse, .    IsPrim
20ac0 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
20ad0 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ) ? SQLITE_CONST
20ae0 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
20af0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
20b10 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
20b20 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e  T_UNIQUE,.    on
20b30 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f  Error, zErr, P4_
20b40 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73  DYNAMIC, P5_Cons
20b50 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
20b60 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  .../*.** Code an
20b70 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
20b80 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
20b90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20ba0 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
20bb0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20bc0 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
20bd0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
20be0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
20bf0 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
20c00 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
20c10 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
20c20 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  b       /* The t
20c30 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f  able with the no
20c40 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a  n-unique rowid *
20c50 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  / .){.  char *zM
20c60 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
20c70 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
20c80 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d  =0 ){.    zMsg =
20c90 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
20ca0 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e  pParse->db, "%s.
20cb0 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
20cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
20ce0 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
20cf0 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
20d00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
20d10 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
20d20 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
20d30 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
20d40 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
20d50 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54  , "%s.rowid", pT
20d60 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
20d70 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
20d80 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20  TRAINT_ROWID;.  
20d90 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  }.  sqlite3HaltC
20da0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
20db0 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a  , rc, onError, z
20dc0 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Msg, P4_DYNAMIC,
20dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20de0 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73           P5_Cons
20df0 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
20e00 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
20e10 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
20e20 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
20e30 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
20e40 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
20e50 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
20e60 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
20e70 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
20e80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
20e90 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
20ea0 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
20eb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
20ec0 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
20ed0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
20ee0 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
20ef0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
20f00 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
20f10 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
20f20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
20f30 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
20f40 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c   assert( z!=0 ||
20f50 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20f60 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66  n[i]<0 );.    if
20f70 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
20f80 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73  mn[i]>=0 && 0==s
20f90 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
20fa0 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
20fb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
20fc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
20fd0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20fe0 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
20ff0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
21000 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
21010 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
21020 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
21030 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
21040 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
21050 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
21060 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21070 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
21080 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
21090 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
210a0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
210b0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
210c0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
210d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
210e0 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
210f0 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
21100 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
21110 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
21120 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
21130 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
21140 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
21150 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
21160 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
21170 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
21180 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
21190 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
211a0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
211b0 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
211c0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
211d0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
211e0 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
211f0 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
21200 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
21210 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
21220 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
21230 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
21240 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
21250 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
21260 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
21270 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
21280 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
21290 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
212a0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
212b0 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
212c0 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
212d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
212e0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
212f0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
21300 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
21310 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
21320 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
21330 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21350 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
21360 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
21390 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
213a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
213b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
213c0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
213d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
213e0 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21400 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
21410 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
21420 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
21430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21440 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
21450 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
21460 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21470 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
21480 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a  texes(db) );  /*
21490 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65   Needed for sche
214a0 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66  ma access */.  f
214b0 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
214c0 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
214d0 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
214e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
214f0 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
21500 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
21510 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
21520 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
21530 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
21540 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
21550 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
21560 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
21570 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
21580 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
21590 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
215a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
215b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
215c0 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
215d0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
215e0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21600 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
21610 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
21620 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
21630 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
21640 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
21650 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
21660 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
21670 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
21680 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
21690 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
216a0 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
216b0 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
216c0 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
216d0 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
216e0 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
216f0 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
21700 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
21710 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
21720 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
21730 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
21740 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
21750 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
21760 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
21770 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
21780 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
21790 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
217a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
217b0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
217c0 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
217d0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
217e0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
217f0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
21800 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
21810 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
21820 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
21830 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
21840 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
21850 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21870 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
21880 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
21890 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
218a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
218b0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
218c0 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
218d0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
218e0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
218f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
21900 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
21910 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
21920 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
21930 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
21940 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21960 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
21970 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
21980 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
21990 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
219a0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
219b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
219c0 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
219d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
219e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
219f0 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
21a00 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
21a10 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
21a20 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
21a30 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21a40 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
21a50 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
21a60 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
21a70 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
21a80 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
21a90 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
21aa0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
21ab0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
21ac0 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
21ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
21ae0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
21af0 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
21b00 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
21b10 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29  NEVER(pName2==0)
21b20 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
21b30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
21b40 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oll;.    assert(
21b50 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
21b60 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
21b70 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
21b80 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
21b90 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
21ba0 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ll ) return;.   
21bb0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
21bc0 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
21bd0 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
21be0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
21bf0 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64  l ){.      reind
21c00 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
21c10 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
21c20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21c30 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  db, zColl);.    
21c40 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
21c50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21c60 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
21c70 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
21c80 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
21c90 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
21ca0 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
21cb0 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
21cc0 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
21cd0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
21ce0 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b  n(db, pObjName);
21cf0 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
21d00 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62  turn;.  zDb = db
21d10 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
21d20 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
21d30 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
21d40 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  z, zDb);.  if( p
21d50 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  Tab ){.    reind
21d60 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
21d70 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  pTab, 0);.    sq
21d80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21d90 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
21da0 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
21db0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
21dc0 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
21dd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21de0 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   z);.  if( pInde
21df0 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
21e00 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
21e10 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
21e20 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
21e30 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
21e40 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
21e50 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
21e60 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
21e70 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
21e80 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
21e90 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
21ea0 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
21eb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
21ec0 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  urn a KeyInfo st
21ed0 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
21ee0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
21ef0 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e  the given Index.
21f00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e  .**.** The KeyIn
21f10 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  fo structure for
21f20 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63 61 63   an index is cac
21f30 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64 65 78  hed in the Index
21f40 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74   object..** So t
21f50 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75  here might be mu
21f60 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
21f70 73 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65  s to the returne
21f80 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a  d pointer.  The.
21f90 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
21fa0 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64 69   not try to modi
21fb0 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  fy the KeyInfo o
21fc0 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
21fd0 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69   caller should i
21fe0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79  nvoke sqlite3Key
21ff0 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74  InfoUnref() on t
22000 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
22010 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61  ct.** when it ha
22020 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67  s finished using
22030 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20   it..*/.KeyInfo 
22040 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  *sqlite3KeyInfoO
22050 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  fIndex(Parse *pP
22060 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
22070 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  x){.  int i;.  i
22080 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
22090 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
220a0 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  Key = pIdx->nKey
220b0 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  Col;.  KeyInfo *
220c0 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50 61 72  pKey;.  if( pPar
220d0 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
220e0 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  n 0;.  if( pIdx-
220f0 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a  >uniqNotNull ){.
22100 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
22110 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
22120 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c  Parse->db, nKey,
22130 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d   nCol-nKey);.  }
22140 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 20 3d  else{.    pKey =
22150 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
22160 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
22170 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20   nCol, 0);.  }. 
22180 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
22190 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
221a0 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
221b0 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20 20  le(pKey) );.    
221c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
221d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
221e0 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d  r *zColl = pIdx-
221f0 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
22200 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
22210 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  =0 );.      pKey
22220 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 74 72  ->aColl[i] = str
22230 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52  cmp(zColl,"BINAR
22240 59 22 29 3d 3d 30 20 3f 20 30 20 3a 0a 20 20 20  Y")==0 ? 0 :.   
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22260 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
22270 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
22280 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
22290 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
222a0 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
222b0 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
222c0 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
222d0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  >nErr ){.      s
222e0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
222f0 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ef(pKey);.      
22300 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pKey = 0;.    }.
22310 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65    }.  return pKe
22320 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  y;.}..#ifndef SQ
22330 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
22340 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
22350 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  e is invoked onc
22360 65 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65  e per CTE by the
22370 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61   parser while pa
22380 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48  rsing a .** WITH
22390 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74   clause. .*/.Wit
223a0 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64  h *sqlite3WithAd
223b0 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
223c0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
223d0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
223e0 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
223f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
22400 45 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c  Existing WITH cl
22410 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  ause, or NULL */
22420 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  .  Token *pName,
22430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
22440 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e  me of the common
22450 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72  -table */.  Expr
22460 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20  List *pArglist, 
22470 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20      /* Optional 
22480 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74  column name list
22490 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
224a0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65  /.  Select *pQue
224b0 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51  ry          /* Q
224c0 75 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69  uery used to ini
224d0 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c  tialize the tabl
224e0 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
224f0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
22500 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77  db;.  With *pNew
22510 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
22520 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
22530 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69  t the CTE name i
22540 73 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20  s unique within 
22550 74 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65  this WITH clause
22560 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73  . If.  ** not, s
22570 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  tore an error in
22580 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63   the Parse struc
22590 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65  ture. */.  zName
225a0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
225b0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
225c0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
225d0 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68  ( zName && pWith
225e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
225f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
22600 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
22610 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
22620 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c  e3StrICmp(zName,
22630 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61   pWith->a[i].zNa
22640 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
22650 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
22660 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
22670 63 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20  cate WITH table 
22680 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  name: %s", zName
22690 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
226a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74  .  }..  if( pWit
226b0 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  h ){.    int nBy
226c0 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69  te = sizeof(*pWi
226d0 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57  th) + (sizeof(pW
226e0 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69  ith->a[1]) * pWi
226f0 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70  th->nCte);.    p
22700 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
22710 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68  ealloc(db, pWith
22720 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
22730 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  e{.    pNew = sq
22740 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
22750 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57  o(db, sizeof(*pW
22760 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ith));.  }.  ass
22770 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 7c 7c  ert( zName!=0 ||
22780 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 61 73   pNew==0 );.  as
22790 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
227a0 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 4e 65  Failed==0 || pNe
227b0 77 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  w==0 );..  if( p
227c0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
227d0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
227e0 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74  ete(db, pArglist
227f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
22800 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
22810 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
22820 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
22830 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  ame);.    pNew =
22840 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b   pWith;.  }else{
22850 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
22860 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74  w->nCte].pSelect
22870 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70   = pQuery;.    p
22880 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
22890 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c  e].pCols = pArgl
228a0 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ist;.    pNew->a
228b0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61  [pNew->nCte].zNa
228c0 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
228d0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
228e0 74 65 5d 2e 7a 45 72 72 20 3d 20 30 3b 0a 20 20  te].zErr = 0;.  
228f0 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a    pNew->nCte++;.
22900 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e    }..  return pN
22910 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ew;.}../*.** Fre
22920 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
22930 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  f the With objec
22940 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
22950 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
22960 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22970 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74  WithDelete(sqlit
22980 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57  e3 *db, With *pW
22990 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74  ith){.  if( pWit
229a0 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
229b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
229c0 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29  With->nCte; i++)
229d0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43  {.      struct C
229e0 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74  te *pCte = &pWit
229f0 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73  h->a[i];.      s
22a00 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
22a10 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
22a20 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cols);.      sql
22a30 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
22a40 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
22a50 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ct);.      sqlit
22a60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74  e3DbFree(db, pCt
22a70 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e->zName);.    }
22a80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
22a90 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20  ee(db, pWith);. 
22aa0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
22ab0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
22ac0 4d 49 54 5f 43 54 45 29 20 2a 2f 0a              MIT_CTE) */.